Из руководства scanf
:
s Соответствует последовательности
непробельные символы; следующий
указатель
должен быть указатель на символ, и массив должен быть достаточно большим, чтобы
принять всю последовательность и завершающий символ NUL.
строка ввода останавливается на пустом месте или на максимальной ширине поля,
что наступит раньше.
Вы вызываете UB. Попробуйте:
#define str(x) #x
#define xstr(s) str(x)
#define BUFSIZE 30
char buffer[ BUFSIZE + 1 ];
scanf("%" xstr(BUFSIZE) "s", buf);
Чтобы игнорировать что-либо, кроме BUFSIZE
, символы подавляют присваивание:
scanf("%" xstr(BUFSIZE) "s%*", buf);
Вам также следует проверить, ввел ли пользователь возврат / перевод строки, и прекратить действие scanf
, если у него есть:
scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);
и рекомендуется проверять возвращаемые значения, поэтому:
int rc = scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);
и, наконец, проверьте, осталось ли что-нибудь (например, перевод строки, и используйте его):
if (!feof(stdin))
getchar();