Как заставить работать компилятор GCC? [закрыто]

Итак, я новичок в программировании на C. Я использую Vim в качестве редактора и GCC в качестве компилятора, но он работает неправильно. Допустим, я делаю базовую программу, чтобы определить, четное или нечетное число. Вот мой код:

#include <stdio.h>

int main(int argc, char argv[])
{
    int i;

    printf("Enter a number: ");
    scanf("%d\n", &i);

    printf("%d\n", i);
    if(i % 2 == 0)
    {
        printf("Your number is even.\n");
    }
    else if(i % 2 != 0)
    {
        printf("Your number is odd.\n");
    }
    else
    {
        printf("Invalid input.\n");
    }

    getchar();

    return 0;
}

Я не уверен, что я программирую неправильно, или GCC просто плохой компилятор, или что-то в этом роде. Я использую Linux, в котором я выполняю двойную загрузку с Windows. Теперь я нажимаю CTRL - D , чтобы остановить процесс, и только после этого он распечатывает мне мой номер и сообщает, четный он или нечетный. Дело не только в этом, похоже, что многие другие программы с похожими форматами делают это.

~ $ ./test
Enter a number: 45
45                         //I press enter, nothing happends. Ctrl-d 
Your number is even.       //ctrl-d again
~ $ 
0
задан 3 November 2015 в 08:06

2 ответа

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

Первый: scanf("%d\n", &i); должен быть scanf("%d", &i);.

Также другие ошибки:

  • Второй аргумент main() должно быть литым или к указателю на массив символов или к указателю на указатель на символ: char *argv[] или char **argv;
  • Если i не число, это все еще будет литым к целому числу оба в if(i % 2 == 0) и else if(i % 2 != 0) для выражения, которое будет оценено (на самом деле Вы никогда не будете добираться до else блок с помощью того кода, как также if(i % 2 == 0) или else if(i % 2 != 0), быть i неявно литой к целому числу, оценит к истинному). Имейте чтение в этом для более надлежащих способов проверить, является ли строка числовой.
0
ответ дан 30 September 2019 в 06:02

А-ч, какого черта. Я попробую отвечать на это во всяком случае.

Короткий ответ: удалите \n от аргумента до scanf. Когда я делаю это, Ваш код ведет себя как ожидалось (хорошо, чтобы быть дотошным, я также должен был измениться argv[] в *argv[].)

Более длинный ответ: Вы никогда не должны действительно использовать scanf; это обычно получает Вас в проблему.

Хм... мой более длинный ответ был короче, чем мой короткий ответ. А-ч хорошо.

1
ответ дан 30 September 2019 в 06:02

Другие вопросы по тегам:

Похожие вопросы: