Быстрое решение.
Поскольку вы передаете переменные char в scanf
вместо указателей.
scanf("%c %c %c %c %c", &first, &second, &third, &fourth, &fifth);
Правило большого пальца.
Icemanind упомянул, что "При использовании scanf вы должны предварять каждую переменную амперсандом ", но это слишком широко.Если вы строго следуете этому правилу, вы можете передавать указатели на указатели -...Вместо этого, как правило, вы должны
- передать адрес переменной, в которую вы хотите записать .
и
- Тип цели должен точно соответствовать спецификации токенов формата ,
О последнем: Например, вы облажались, если вы проходите двойнойуказатель для токена формата %d
.
Prevention.
Если вы использовали предупреждения компилятора, в вашем конкретном случае -Wformat
, но в общем случае просто используйте -Wall
(ижелательно -Wextra
(тоже), компилятор предупредил бы вас:
gcc -Wall -Wextra foo.c
warning.cc: In function `int main()':
warning.cc:4: warning: format argument is not a pointer (arg 2)
warning.cc:4: warning: format argument is not a pointer (arg 3)
warning.cc:4: warning: format argument is not a pointer (arg 4)
warning.cc:4: warning: format argument is not a pointer (arg 5)
warning.cc:4: warning: format argument is not a pointer (arg 6)
Для любопытных: Это предупреждение основано на расширении компилятора, которое предназначено для строк формата (см. список атрибутов gcc *)1037 *:
Атрибут формата указывает, что функция принимает аргументы стиля printf, scanf, strftime или strfmon, которые должны проверяться типом по строке формата. Например, объявление:
extern int
my_printf (void *my_object, const char *my_format, ...)
__attribute__ ((format (printf, 2, 3)));