C101: лучший способ заполнить массив из пользовательского ввода? - PullRequest
1 голос
/ 22 сентября 2008

Мне трудно разобраться, и поэтому я управляю массивами и индексами вручную в 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.

}

Любой совет будет высоко ценится!

Обновление:

Теперь это работает! Большое спасибо всем вам за эти мгновенные ответы. Это определенно отличное сообщество, оно мне очень помогает.

Ответы [ 8 ]

4 голосов
/ 22 сентября 2008
arr[idx] <= MAX

должно быть

idx <= MAX
2 голосов
/ 22 сентября 2008

Используя цикл 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;
}
2 голосов
/ 22 сентября 2008

до римского М:

Прежде всего, парень, задающий вопрос, только что начал курс программирования и, вероятно, еще не изучил указатели. Во-вторых, теперь вы имеете дело как со счетчиком, так и с указателем. Я не уверен, что вижу в этом выгоду по сравнению с использованием индекса, подобного следующему:

для (idx = 0; idx

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

}

2 голосов
/ 22 сентября 2008
while(arr[idx] != -1 && idx <= MAX){ // Fixed by sklivvz
    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);
    idx++;        
}

Прежде всего, вы должны проверить, меньше ли индекс variabel idx, чем MAX (не меньше или равен). Вы вышли бы за пределы, если ваш индекс равен MAX. Массив с MAX = 10 имеет значения индекса от 0 до 9 включительно, но не 10.

Во-вторых, вы добавляете первый элемент к arr [0], увеличиваете свой индекс с 0 до 1, затем возвращаетесь к условию while и проверяете, является ли arr [1] == -1, что не , Поэтому проверьте вместо этого arr [idx-1]! = -1. Однако обратите внимание, что в первый раз, когда вы попадете в цикл while, вы на самом деле проверите arr [-1]! = -1, что также выходит за пределы. ;) Так что вам нужно выяснить, как решить эту проблему.

1 голос
/ 22 сентября 2008

Я бы пошел с чем-то вроде этого.

Вам не нужно беспокоиться о границах массива и других запутанных условиях.

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
}
1 голос
/ 22 сентября 2008

В вашем первом цикле while,

arr[idx] <= MAX

строка должна читаться как

idx <= MAX

Во втором цикле вы увеличиваете idx перед тестом - он должен заканчиваться

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

Я также стараюсь заключить в скобки все внутренние условия, просто чтобы быть абсолютно уверенным в правильности приоритета (отсюда и дополнительные скобки выше).

1 голос
/ 22 сентября 2008
arr[idx] <= MAX

должно быть

idx < MAX

, если вы не проверяете элемент вместо индекса.

Вы также всегда проверяете «следующий» элемент на -1 (arr [idx]! = -1), потому что вы увеличиваете idx до проверки добавленной стоимости.

так что если у вас было

arr[idx-1] != -1

с тобой все будет в порядке.

1 голос
/ 22 сентября 2008

C массивы начинают считать с 0.

Если вы выделите массив размера MAX, доступ к элементу в MAX будет ошибкой. Измените цикл на;

int arr[MAX];
for ( .... && idx < MAX )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...