Хобрук: Ваш путь к мастерству в программировании

Получить несколько слов, не получая \n на языке C

Как вы сканируете несколько слов (с пробелами между ними и произвольным числом) в строку и не получаете символ «\ n» в конце? Я знаю, что подобные вопросы задавались, но ни один из них не дал действительно удовлетворительного ответа. Я надеюсь получить ответ для достижения такого механизма в одном заявлении.

14.07.2018


Ответы:


1
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% необходимость.

14.07.2018
  • char nl; .... " %255[^\n]%[\n]", buffer, &nl проблема, так как пишется 2+ символа. Предложить char nl[2]; .... " %255[^\n]%1[\n]", buffer, nl 15.07.2018
  • Мозг в «жареном режиме» — исправление (код, а не мозг — дело безнадежное!). 15.07.2018
  • Обратите внимание, что этот подход терпит неудачу, когда строка состоит только из "\n", так как она потребляется scanf(" %255[^\n]%[\n]",... и смотрит на следующую строку. 15.07.2018
  • Предполагая, что в формате нет начального пробела, набор сканирования не принимает нулевые символы как допустимые. Таким образом, если следующий символ является новой строкой (пустой строкой), первый набор сканирования завершается ошибкой, а возвращаемое значение из scanf() равно 0 — не EOF, а полная ошибка сопоставления. Если есть начальный пробел, ввод ищет первую строку, содержащую хотя бы один непробельный символ. Альтернативой является использование fgets() или POSIX getline(), но это можно использовать как часть более длинной строки формата. Как всегда, все зависит от того, что вам нужно. Функция scanf() хитрая! 15.07.2018
  • Да, scanf() сложно. 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
  • Новые материалы

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..