С101:лучший способ заполнить массив из пользовательского ввода?
Вопрос
Мне трудно понять и, следовательно, управлять массивами и индексами вручную в 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
}