Intereting Posts
Внешнее прерывание 8051 Смещение многомерных массивов новый для C, ошибка C2371: «ошибка»: переопределение, различные базовые типы В чем разница на практике между inline и #define? обработка информации о студентах Scanf пропустил цикл (Hangman) Вызывает функцию с локальными побочными эффектами дважды в одном выражении неопределенного поведения? Как вы делаете возведение в степень в C? недействительное приложение ‘sizeof’ для неполного типа ‘int ‘ При обращении к целочисленному массиву, указанному указателем Как напечатать строку, которую __FILE__ расширяет, чтобы правильно? #define против перечислений для адресации периферийных устройств Функции более высокого порядка в C как синтаксический сахар с минимальными усилиями Использование указателей для обмена значениями массива int Проверка возвращаемого значения функции без оператора возврата Unmasking данных / multi-byte xor

Каково поведение scanf при использовании спецификатора формата «% s» для чтения в одиночном символе?

#include  int main(void){ char a; scanf("%s", &a); return 0; } 

Работает для меня, но мне интересно, могут ли быть другие неожиданные результаты.

Возьмите этот код, например,

 #include  int main(void){ char a; char b = '1'; char c = '1'; scanf("%s", &a); printf("%c = %c\n", b, c); return 0; } 

Вы ожидали, что он будет печатать 1 = 1 , но только сейчас, когда я его запустил, он напечатал = 1 (по крайней мере, в моем компиляторе, не ожидайте от него ничего стабильного)

scanf записывает строку в адрес a, ожидая, что там было выделено достаточно места (что в этом случае неверно), эта строка имеет входной символ и нулевой терминатор. Нуль-терминатор перезаписывает некоторую другую память, в моем случае – в b. Это неопределенное поведение – не делайте этого (по крайней мере, не ожидая, что это будет иметь смысл).

Либо используйте формат %c для соответствия одному char , либо используйте %s для соответствия строке.

Смешение их (как в вашем коде) – это неопределенное поведение, что-то может случиться .