цикл for не завершается при ложном условии

#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 входных данных.