Во-первых, не ясно, что делает s
в вашей строке формата. Часть %[^\n]
является самодостаточным спецификатором формата. Это не модификатор для формата %s
, как вы, кажется, верите. Это означает, что строка формата "%[^\n]s"
будет интерпретироваться scanf
как два независимых спецификатора формата: %[^\n]
, за которым следует одиночный s
. Это заставит scanf
прочитать все, пока не встретится \n
(оставив \n
непрочитанным), а затем потребует, чтобы следующий входной символ был s
. Это просто не имеет никакого смысла. Никакие входные данные не будут соответствовать такому противоречивому формату.
Во-вторых, очевидно, что имелось ввиду scanf("%[^\n]", a)
. Это несколько близко к [больше не доступно] gets
(или fgets
), но это не то же самое. scanf
требует, чтобы каждый спецификатор формата соответствовал хотя бы одному входному символу. scanf
завершится ошибкой и прервется, если он не сможет соответствовать никаким входным символам для запрошенного спецификатора формата. Это означает, что scanf("%[^\n]",a)
не способен читать пустые строки ввода, то есть строки, содержащие символ \n
сразу. Если вы введете такую строку в вышеприведенную scanf
, она вернет 0
, чтобы указать на ошибку, и оставит a
без изменений. Это сильно отличается от того, как работают типичные функции ввода на основе строки.
(Это довольно удивительный и, казалось бы, нелогичный формат %[]
. Лично я предпочел бы, чтобы %[]
мог сопоставлять пустые последовательности и создавать пустые строки, но это не так, как работает стандартный scanf
. )
Если вы хотите читать ввод построчно, fgets
- ваш лучший вариант.