С101:лучший способ заполнить массив из пользовательского ввода?

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++;        
}

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

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

Роману М:

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

для (IDX=0;идентификатор <МАКС;++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;
}

Массивы C начинают отсчет с 0.

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

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

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

arr[idx] <= MAX

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

idx <= MAX

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

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

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

Я бы выбрал что-то вроде этого.

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

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