%[^\n]
читает до, но не включает следующий \n
символ. На простом английском языке он читает строку текста. Обычно строка хранится в строковой переменной char *
.
char line[SIZE];
scanf("%[^\n]", line);
Модификатор *
подавляет такое поведение. После прочтения строка просто отбрасывается, и переменная не требуется.
scanf("%*[^\n]");
*
не изменяет способ обработки ввода. В любом случае, все, кроме следующего \n
, но не включая его, читается из стандартного ввода. При условии отсутствия ошибок ввода / вывода гарантируется, что при следующем чтении из stdin будет отображаться \n
или EOF
.
Какой оператор scanf()
следует использовать, если я хочу прочитать ипосле этого отбрасывать каждый символ в stdin
, включая символ \n
?
Добавить %*c
, чтобы также потреблять \n
.
scanf("%*[^\n]%*c");
Почему вместо %*c
всего \n
? Если бы вы использовали \n
, он бы не потреблял только один символ новой строки, он занимал бы любое количество пробелов, табуляции и новых строк. \n
соответствует любому количеству пробелов. Лучше использовать %*c
, чтобы использовать ровно 1 символ.
// Incorrect
scanf("%*[^\n]\n");
См. Также:
Могу ли я использовать fflush()
вместо этого?
Нет, не надо. fflush(stdin)
не определено.
Не является ли отрицаемый набор сканирования [\n]
полностью избыточным, поскольку scanf()
завершает процесс сканирования соответствующей строки формата при первом появлениисимвол пробела по умолчанию?
С %s
, да, он прекратит чтение с первого символа пробела. %s
читает только одно слово. %[^\n]
, напротив, читает всю строку. Он не будет останавливаться на пробелах или табуляциях, только на новых строках.
В более общем смысле, в квадратных скобках актуальны только точные перечисленные символы. Для пробелов нет особого поведения. В отличие от %s
он не пропускает начальные пробелы и не останавливает обработку рано, если встречает пробелы.