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 на нулевой длине.

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