Проблема в том, что "%s"
пытается пропустить пробел, а затем прочитать строку - и, согласно scanf
, новой строкой будет "пробел".
Очевидной альтернативой будет использование "%c"
вместо "%s"
. Разница между ними заключается в том, что "%c"
не не пытается пропустить начальные пробелы.
Несколько менее очевидной (или, во всяком случае, менее известной) альтернативой было бы использование "%[^\n]%*[\n]"
. Это читает данные до тех пор, пока они не встретят новую строку, затем читает новую строку и не присваивает их чему-либо.
Независимо от того, какое преобразование вы используете, вы хотите (нужно, действительно) ограничить количество вводимого ввода, чтобы оно не переполняло предоставленный вами буфер, поэтому вы захотите использовать "%39c"
или "%39[^\n]"
. Обратите внимание, что когда вы указываете длину для scanf
, вам нужно вычесть единицу, чтобы оставить место для терминатора NUL (в отличие от fgets
, для которого вы указываете полный размер буфера).