#arrays #c #loops #for-loop
#массивы #c #циклы #цикл for
Вопрос:
for
Цикл должен повторяться только 5 раз, но первый for
цикл повторяется 6 раз, но секунды работают корректно с тем же условием.
int i, j, n = 5;
int *p;
printf("enter size of array=");
scanf("%d", amp;n);
p = (int *)calloc(sizeof(int), n);
printf("enter arrayn");
for (i = 0; i < n; i ) {
scanf("%d ", (p i));
}
printf("arrayn");
for (j = 0; j < n; j ) {
printf("%d ", *(p j));
}
free(p);
Комментарии:
1. Введите «что-нибудь глупое» для 5-го значения scanf… вместо «42<ENTER>» что-то вроде «42foobar<ENTER>»
2. Некоторые рекомендуют вообще не использовать scanf. Это немного похоже на то, как если бы тебя привязали к мертвому верблюду посреди пустыни. Поначалу это звучит захватывающе, но быстро становится утомительным. Способ сделать это, менее подверженный неожиданностям, — это использовать
fgets()
, а затем использовать такие функции, какstrtol
и т.д.3. Обычно мы не пишем
(p i)
или*(p j)
— идиоматический способ их написания — использовать оператор подстрочного индекса массива,amp;p[i]
иp[j]
.
Ответ №1:
Количество итераций обоих циклов определяется первым числом, введенным в командной строке enter size of array=
.
Вы должны быть более защищенными: отклонять недопустимый ввод и обнаруживать ошибки.
Вот модифицированная версия:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, n;
int *p;
printf("Enter array size: ");
if (scanf("%d", amp;n) != 1 || n <= 0) {
printf("invalid inputn");
return 1;
}
p = (int *)calloc(sizeof(int), n);
if (p == NULL) {
printf("allocation failuren");
return 1;
}
printf("enter arrayn");
for (i = 0; i < n; i ) {
if (scanf("%d ", (p i)) != 1) {
printf("invalid inputn");
return 1;
}
}
printf("arrayn");
for (i = 0; i < n; i ) {
printf("%d ", *(p i));
}
printf("n");
free(p);
return 0;
}
Ответ №2:
эй, @harsh, ты не ошибся с точки зрения указателей. но проблема вызвана scanf.
Поскольку вы указали ‘_’ (пробел)( scanf(«%d», (p i)) ) после %d ; тогда scanf всегда будет находить пробел (или любой другой символ интервала) после каждого вхождения указанного значения и выполняет итерацию a еще раз в поисках этого, следовательно, он выполнит еще одно вхождение в последний раз.
просто удалите это пространство, оно будет работать. Надеюсь, это поможет.
Ответ №3:
выполнить
scanf ("%d", (p i))
т.е. не указывать пробел после %d
также синтаксис calloc должен быть
p = (int *)calloc(n, sizeof(int));
Комментарии:
1. Можете ли вы сказать мне причину, по которой мы не должны указывать пробел в scanf после %d …….. пожалуйста, поделитесь со мной
2. @HarshGour когда вы выполняете «%d » в scanf, scanf не завершается после получения целого числа, потому что в scanf вы указали не только %d, вы также указали пробел. таким образом, scanf ожидает некоторых других значений, даже когда вы нажимаете ENTER. Первый scanf ожидает 2 ввода. в вашем первом цикле for, непосредственно перед scanf, напишите «printf («Итерация № %d», i);». Это покажет вам количество итераций цикла. Вы увидите, что 1-й (или 0-й) scanf завершится после принятия 2 входных данных.