C101:أفضل طريقة لملء مجموعة من إدخال المستخدم?

StackOverflow https://stackoverflow.com/questions/112582

  •  02-07-2019
  •  | 
  •  

سؤال

أواجه صعوبة في فهم وبالتالي إدارة المصفوفات والمؤشرات يدويا في C.هذه هي بلدي اثنين من النهج الكلاسيكي ولكن لا يبدو أن العمل كما أنها تبقي حلقات عندما يكون الشرط هو الوصول إلى:

#include<stdio.h>
#define MAX 255

int main(){

    int arr[MAX]={0};
    int idx=0;

    /* Approach #1 */

    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);

    while(arr[idx-1] != -1 && idx < MAX){
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;        
    }

    /* Approach #2 */

    do{
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;
    }while(arr[idx-1] != -1 && idx < MAX);

    // Main func continues here.

}

أي نصيحة سيكون محل تقدير كبير!

تحديث:

الآن يعمل!شكرا كثيرا كل لك يا شباب على هذه الردود الفورية.هذا هو بالتأكيد كبيرة في المجتمع, وهو يساعد لي الكثير.

هل كانت مفيدة؟

المحلول

arr[idx] <= MAX

يجب أن يكون

idx < MAX

ما لم يتم التحقق من البند بدلا من المؤشر.

أنت أيضا دائما التحقق من "التالي" عنصرا -1 (arr[idx] != -1) لأنك تزايد idx قبل التحقق من القيمة المضافة.

حتى إذا كنت قد

arr[idx-1] != -1

كنت سوف يكون على ما يرام.

نصائح أخرى

arr[idx] <= MAX

يجب أن يكون

idx <= MAX
while(arr[idx] != -1 && idx <= MAX){ // Fixed by sklivvz
    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);
    idx++;        
}

أولا وقبل كل شيء ، يجب عليك التحقق إذا كان مؤشر variabel idx أصغر من ماكس (ليس أصغر من أو يساوي).يمكنك أن تذهب خارج الحدود إذا كان مؤشر يساوي ماكس.مجموعة مع الحد الأقصى = 10 المؤشر القيم من 0 إلى 9 ، ولكن ليس 10.

ثانيا, يمكنك إضافة العنصر الأول إلى arr[0], زيادة الفهرس الخاص بك من 0 إلى 1 ، ثم تقفز مرة أخرى إلى حين-حالة التحقق إذا arr[1] == -1 ، وهي ليست كذلك.حتى تحقق بدلا من أن arr[idx-1] != -1.نلاحظ أن أول مرة تحصل على حين حلقة ، سوف تحقق فعلا arr[-1] != -1, الذي هو أيضا خارج الحدود.;) لذلك تحتاج إلى معرفة كيفية حل هذه القضية.

الروماني M:

أولا: الرجل طرح السؤال قد بدأت للتو دورة البرمجة, و ربما لم يتعلموا بعد عن المؤشرات.ثانيا, يمكنك الآن التعامل مع العداد و مؤشر.أنا لست متأكدا من أنني أرى الفائدة من القيام بذلك مقابل استخدام مؤشر مثل هذا:

ل(idx=0;idx < ماكس ؛ ++idx) {

scanf("%d", &arr[idx]);
if(arr[idx] == -1)
    break;

}

باستخدام حلقة for يمكنك القضاء على الحاجة إلى الفوضى idx-1 التحقق من التعليمات البرمجية:

/* Approach #3*/
int i;
int value;

for (i = 0; i < MAX; ++i)
{
  printf("Enter elements, -1 to finish:\n");
  scanf("%d", &value);
  if (value == -1) break;
  arr[i] = value;
}

ج المصفوفات يبدأ العد من 0.

إذا كنت تخصيص مجموعة من حجم ماكس الوصول إلى عنصر في ماكس سوف يكون خطأ.تغيير حلقة ؛

int arr[MAX];
for ( .... && idx < MAX )

في أول حلقة من الوقت ،

arr[idx] <= MAX

السطر

idx <= MAX

في الحلقة الثانية, أنت تزايد idx قبل الاختبار - يجب أن ينتهي

} while ((arr[idx-1] != -1) && (idx-1 <= MAX));

كما تميل إلى parenthesize كل الظروف الداخلية فقط أن تكون على يقين تماما أن الأسبقية هو الصحيح (ومن إضافية بين قوسين أعلاه).

كنت أذهب مع شيء من هذا القبيل.

كنت لا داعي للقلق حول حدود مجموعة أخرى مربكة الظروف.

int cnt = MAX;        // how many elements in the array, in this case MAX
int * p = &arr[0];    // p is a pointer to an integer and is initialize to the address of the first
                      // element of the array. So now *p is the same as arr[0] and p is same as &arr[0]

// iterate over all elements. stop when cnt == 0
while (cnt) {

    // do somthing
    scanf("%d", *p); // remember  that *p is same as arr[some index]
    if (*p == -1)    // inspect element to see what user entered
        break;

    cnt --;  // loop counter
    p++;     // incrementing p to point to next element in the array
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top