scanf ПОСЛЕ fgets нарушает оператор fgets
Я видел различные сообщения о том, как использовать scanf до того, как fgets может вызвать проблемы. Однако для меня нет смысла, почему добавление этого ПОСЛЕ должно привести к разрыву первого оператора.
Вот что у меня есть:
unsigned char key;
unsigned char message[100];
printf(" Please input a message \n ");
fgets(message, MAX_BUF, stdin);
printf("Your message is: %s \n", message);
// Read user input for message
printf(" Please input a numeric key\n ");
scanf("%d", &key);
printf("Your message is: %s \n", message);
printf("strlen(message) = %d \n", strlen(message));
И это "пробный запуск":
Please input a message
hello
Your message is: hello
Please input a numeric key
123
Your message is:
strlen(message) = 0
Таким образом, переменная сообщения становится пустой независимо от ввода. Однако, если я закомментирую строку с помощью scanf, все будет работать (за исключением того, что я не могу назначить клавишу).
Помогите!
1 ответ
%d
спецификатор формата для scanf()
обещание, что следующий аргумент - это адрес буфера памяти, который достаточно велик для хранения int
(обычно 4 или 8 байт), но ваш key
это просто 1 байт unsigned char
, так scanf()
запишет 3 (или, возможно, 7) байта после конца, попирая все, что занимает эту память - в этом случае, весьма вероятно, message
, Что именно он там пишет, будет зависеть от порядкового номера вашей системы, но для небольших входных данных (<= 255) в системе с прямым порядком байтов (например, x86) ее второй байт (который будет записан в первый байт message
) будет 0, что фактически завершается нулем message
на нулевой длине.