Как вы сканируете несколько слов (с пробелами между ними и произвольным числом) в строку и не получаете символ «\ n» в конце? Я знаю, что подобные вопросы задавались, но ни один из них не дал действительно удовлетворительного ответа. Я надеюсь получить ответ для достижения такого механизма в одном заявлении.
Получить несколько слов, не получая \n на языке C
- Возможный дубликат Как читать с ввода до новой строки находится с помощью scanf()? 15.07.2018
Ответы:
char buffer[256];
if (scanf(" %255[^\n]", buffer) != 1)
…oops — EOF or something dramatically awry…
Набор сканирования не пропускает начальные пробелы (а также %c
или %n
), поэтому я добавил начальный пробел, чтобы пропустить начальные пробелы. Если вам также нужны начальные пробелы, отбросьте этот пробел в строке формата, но на вас лежит ответственность за то, чтобы следующий символ во входных данных не был новой строкой (что часто бывает, если вы только что прочитали число, Например). Преобразование (набор сканирования) останавливается при достижении новой строки, или в конце строки, или при чтении 255 символов. Вы можете добавить %*[\n]
для чтения новой строки, если следующий символ является новой строкой. Однако вы никогда не узнаете, совпало это или нет. Если вы должны знать, вам нужно:
char buffer[256];
char nl[2];
int rc;
if ((rc = scanf(" %255[^\n]%[\n]", buffer, nl)) <= 0)
…oops — EOF or something dramatically awry…
else if (rc == 1)
…no newline — presumably the input line was longer than 255 characters…
else
…data in buffer is a complete line except for the newline, but the newline was read…
Обратите внимание на использование 255 против 256 — это не случайность, а 100% необходимость.
char nl; .... " %255[^\n]%[\n]", buffer, &nl
проблема, так как пишется 2+ символа. Предложитьchar nl[2]; .... " %255[^\n]%1[\n]", buffer, nl
15.07.2018"\n"
, так как она потребляетсяscanf(" %255[^\n]%[\n]",...
и смотрит на следующую строку. 15.07.2018scanf()
равно0
— не EOF, а полная ошибка сопоставления. Если есть начальный пробел, ввод ищет первую строку, содержащую хотя бы один непробельный символ. Альтернативой является использованиеfgets()
или POSIXgetline()
, но это можно использовать как часть более длинной строки формата. Как всегда, все зависит от того, что вам нужно. Функцияscanf()
хитрая! 15.07.2018scanf()
сложно.scanf(" %255[^\n]%[\n]"....
с вводом"abc\n\n"
попытается записать за пределыchar nl[2];
. При вводе"abc\n", the function will block and not return until some non
'\n'` читается после'\n'
. 15.07.2018