Вся информация в этом ответе была извлечена из man scanf
.
Код формата %[
не будет соответствовать пустой:
[
Спички последовательность непустое символов из определенного набора принятых символов
Помните, что scanf
имеет очень полезный возвращаемое значение:
Данные функции ионы возвращают количество успешно введенных и назначенных элементов ввода, которые могут быть меньше, чем предусмотрено, или даже нуля в случае раннего совпадения.
Вы всегда должны проверять возвращаемое значение scanf, поскольку выходные аргументы имеют неуказанные значения, если соответствующий элемент ввода не может быть успешно согласован.
В этом случае возвращаемое значение скажет вам, была ли непустая строка, предшествующая символу новой строки.
Как показано, что ваш код имеет утечки памяти (при условии, что более чем одна строка читается), так как модификатор m
вызывает память выделяться, даже не глядя на значение первоначально запасенной в соответствующий аргумент. Поэтому, если аргумент содержит адрес ранее выделенного хранилища, он будет перезаписан адресом вновь выделенного хранилища, а предыдущее распределение будет протекать.
Петля должна быть:
while (!done) {
line = NULL; /* Not strictly necessary */
if (scanf("%m[^\n]", &line) == 1) {
/* Do something with line */
free(line);
} else {
/* Handle an empty line */
}
/* skip trailing newline. See below. */
getchar();
}
scanf("\n")
не только пропустить ни одного символа новой строки. Он не отличается от scanf(" ")
; любые пробелы в формате scanf:
соответствует любому количеству пробелов, в том числе отсутствующих, на входе.
Если вы хотите просто пропустить символ новой строки, используйте getchar()
.
Если вы хотите читать целые строки, то вы, вероятно, лучше использовать [ 'fgets'] (http://en.cppreference.com/w/c/io/fgets) вместо этого. И если вы используете 'fgets', тогда пустая строка будет содержать только новую строку, и все. –