C, переменная инициализация - PullRequest
0 голосов
/ 28 мая 2018

Предполагается, что этот код читает определенное количество чисел, а затем печатает, сколько из них делится на переменную делителя, однако, когда я пишу это так, возникает какая-то проблема.

#include <stdio.h>

int main()
{
    long repeat;
    int divisor;
    long long t;
    long result = 0;

    scanf("%d", &repeat);
    scanf("%d", &divisor);


    for (long i = 0; i < repeat; i++)
    {
        scanf("%d", &t);
        if (t % divisor == 0)
        {
            result++;
        }
    }

    printf("%d",result);
    return 0;
}

Но когда я устанавливаю все переменные в начале на 0, все работает нормально.Может кто-нибудь сказать мне, в чем проблема с первой реализацией?

#include <stdio.h>

int main()
{
    long repeat = 0;
    int divisor = 0;
    long long t = 0;
    long result = 0;

    scanf("%d", &repeat);
    scanf("%d", &divisor);


    for (long i = 0; i < repeat; i++)
    {
        scanf("%d", &t);
        if (t % divisor == 0)
        {
            result++;
        }
    }

    printf("%d",result);
    return 0;
}

1 Ответ

0 голосов
/ 28 мая 2018

Не кто-то, а какая-то вещь - GCC 7.2 может :

% gcc div.c -Wall -Wextra
div.c: In function ‘main’:
div.c:10:13: warning: format ‘%d’ expects argument of type ‘int *’, 
          but argument 2 has type ‘long int *’ [-Wformat=]
     scanf("%d", &repeat);
            ~^   ~~~~~~~
            %ld
div.c:16:17: warning: format ‘%d’ expects argument of type ‘int *’, 
          but argument 2 has type ‘long long int *’ [-Wformat=]
         scanf("%d", &t);
                ~^   ~~
                %lld
div.c:23:14: warning: format ‘%d’ expects argument of type ‘int’, 
          but argument 2 has type ‘long int’ [-Wformat=]
     printf("%d",result);
             ~^
             %ld

В ней также говорится ниже что следует использовать вместо : %ld, %lld и %ld.Поскольку вы не использовали правильные модификаторы длины, поведение было undefined , что заставило вас думать, что вы "исправили" программу, инициализируя переменные нулями.


Кроме того, не забудьте проверить возвращаемое значение scanf и что вам нужно отбросить, например, остальную часть строки, если было введено что-то недопустимое;просто ввод hello в вашу программу приведет к зависанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...