Как ввести строку с пробелами в c char

от admin

Как ввести в cin строки с пробелами в С++

По умолчанию cin (стандартный ввод) в С++ считывает данные до первого пробела. Рассмотрим способы, с помощью которых мы можем передать через стандартный ввод строку, содержащую один или нескольких пробелов, чтобы эта строка могла быть присвоена в качестве значения переменной в программе.

cin по умолчанию пропускает все белые пробелы (пробелы, табуляции, новые строки и т. д.). Вы можете либо изменить его поведение, либо использовать немного другой механизм.

Рассмотрим небольшую программу, которая просит пользователя ввести имя и после этого сразу же отображает введённую строку на экране. Приведённый код работает так, как ожидается, если вводимые данные не содержат пробелов:

Для запуска этого кода сохраните его в файл test.cpp и скомпилируйте:

Запуск скомпилированного файла:

Попробуем ввести строку с пробелами:

Как можно увидеть, из введённой строки «Алексей Милосердов», сохранилось только часть до пробела, то есть «Алексей».

Чтение строки с getline

getline читает символы из входного потока и помещает их в строку — именно это нам и нужно. getline (как и использование строки), требует указать заголовок #include <string>. Отредактируем наш код:

Как можно убедиться, теперь строка считалась полностью, вместе с пробелами.

Изменение поведения cin с помощью noskipws

Как мы уже выяснили, по умолчанию cin пропускает все белые пробелы (пробелы, табуляции, новые строки и т. д.). Чтобы изменить его поведение, используйте манипулятор noskipws следующим образом:

noskipws включает пропуск начальных пробелов с помощью форматированных функций ввода (по умолчанию включено). Не влияет на вывод.

То есть noskipws не поможет нам передать через стандартный ввод строки, содержащие в себе пробелы, кроме тех случаев, когда пробелы стоят в начале строки.

Как получить от пользователя строку с пробелами

Ввод строки в консольном приложении для пользователя не представляет особых сложностей — он просто печатает необходимое количество знаков и нажимает ENTER.

А вот для начинающего программиста на С++ всё может оказаться не так просто и привести к потере времени и сил на решение простой задачи. Зачем эта заморочка существует в С++, лично мне вообще непонятно. Но она существует. И заключается она в следующем.

Строка с пробелами не читается

Точнее, не читается она привычным для С++ способом. Например, если у вас есть переменная str , то вы можете попытаться прочитать в эту переменную строку, введённую пользователем:

И всё будет прекрасно работать, если пользователь введёт строку БЕЗ пробелов. Однако вас ждёт неприятность, если во вводимой строке будут пробелы. Например, если пользователь введёт:

100 200 300

то в переменной str после выполнения инструкции cin >> str; будет только 100 . То есть строка будет прочитана ТОЛЬКО до первого пробела.

Строка читается только до пробела

ЛИРИЧЕСКОЕ ОТСТУПЛЕНИЕ
Вот за это я и не люблю С++. Ну зачем, спрашивается, так было делать?

Но отбросим лирику в сторону, и разберёмся, что же нам в этом случае делать?

А надо просто использовать другой способ. Например, такой:

В этом случае всё будет работать как надо:

Как прочитать строку полностью

Однако если вы думаете, что на этом ваши неприятности закончились, то зря. Это же С++. А не какой-нибудь Паскаль для лохов. У меня вообще иногда возникает подозрение, что создатель С++ преследовал цель не придумать мощный язык, а сделать так, чтобы программировать на нём могли только избранные. Иначе нафига в этом языке столько заморочек?

Итак, вот вам следующий нежданчик:

Здесь мы используем getline() , которая может читать целую строку (в том числе и с пробелами). Но, как вы думаете, сможем ли мы прочитать эту строку в этой программе?

Наверняка вы уже почувствовали подвох. И заключается он в том, что в этой программе вы не сможете прочитать строку str .

Но что же произойдёт? А то, что в переменную str запишется недочитанный буфер ввода, то есть строка » 200 300″ , и мы не сможем ввести новую строку.

Почему так? Потому что первый раз строка была прочитана не полностью, а только до первого пробела. Оставшиеся же символы остались в буфере, и новая строка не может быть введена, пока буфер полностью не прочитан.

Поэтому перед тем, как вводить новую строку, нам надо либо прочитать буфер до конца, либо очистить его.

Пробежаться до конца буфера можно, например, так:

Очистить буфер ввода cin можно, например, так:

то есть программа может быть примерно такой:

Ну что же, теперь, надеюсь, вы представляете, как пользователю ввести строку с пробелами в С++, и эта задачка не поставит вас в тупик.

Как ввести строку с пробелами через cin

Строку с пробелами можно ввести и привычным способом через cin , но для этого потребуется несколько переменных:

Читать:
Касперский управляет брандмауэром как отключить

В этом случае вывод будет таким:

Как ввести строку с пробелами через cin

Как видите, так тоже можно. Правда пробелы при этом способе из введённой пользователем строки исключаются. Кроме того, не всегда удобно использовать несколько переменных для ввода. К тому же пользователю надо как-то знать, сколько пробелов допускается в строке. Ну или сильно усложнять код для обработки ввода.

На этом пока всё. Изучайте С++. Конечно, это далеко не самый простой язык. Но, с другой стороны, его изучение доставит вам много радости от неожиданных открытий, которых вы никогда не найдёте в более простых языках.

Так что я, например, использую Паскаль для работы (когда требуется сделать быстро и без лишних заморочек), а С++ для удовольствия, когда хочется немного помучиться, а результат и сроки не висят над тобой как Дамоклов меч…

Ввести и вывести строку с пробелами несколько раз

Нужно несколько раз ввести и вывести строку, которая содержит пробелы. Сколько раз ввести-вывести — это на усмотрение пользователя. Пытался так, но не работает.

Программа компилируется и цикл повторяется, но когда переменной i присваиваю значение 1 дальше строка не вводится. Выглядит это так:

И так пока я не выйду из цикла. Подскажите в чем ошибка и как исправить.

Дело в том, что все символы после числа и ‘\n’ вместе с ними после ввода 1 в

остаются во входном потоке.

Реально в Вашем случае там скорее всего будут символы \r\n.

непосредственно перед while(i==1); и все заработает.

Вообще не рекомендуется использовать std::getline и >> оператор.

Вот здесь есть ответ на Ваш вопрос.

Считывание с клавиатуры строк, состоящих из слов, разделенных пробелами можно выполнить с помощью приведенного ниже фрагмента программы.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43300

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Строки в C++

В этой статье вы научитесь обрабатывать строки на языке C++. Вы научитесь их объявлять, инициализировать и использовать для различных операций ввода и вывода.

Строка – это набор символов. В языке программирования С++ обычно используются два типа строк:

  • Строки, являющиеся объектами строкового класса (строковый класс стандартной библиотеки C++).
  • C-strings (струны C-стиля).

C-strings

В программировании на C набор символов хранится в виде массивов, это также поддерживается в программировании на С++. Отсюда и название C-strings.

C-строки – это массивы типа char, оканчивающиеся нулевым символом, то есть 0 (значение ASCII нулевого символа равно 0).

Как определить C-strings?

В приведенном выше коде str – это строка, содержащая 4 символа.

Хотя “C++” имеет 3 символа, нулевой символ 0 добавляется в конец строки автоматически.

Альтернативные способы определения строки

Как и в случае с массивами, необязательно использовать все пространство, выделенное для строки. Например:

Пример 1: для чтения слова

Программа на C++ для отображения строки, введенной пользователем:

Обратите внимание, что во втором примере отображается только «Programming» вместо «Programming is fun».

Это потому, что оператор извлечения >> работает, как scanf() в C++ и считает, что промежуток ” ” имеет завершающий символ.

Пример 2: для чтения строки текста

Программа на С++ для чтения и отображения всей строки, введенной пользователем:

Для чтения текста, содержащего пробелы, можно использовать функцию cin.get. Эта функция принимает два аргумента.

Первый аргумент – это имя строки (адрес первого элемента строки), а второй аргумент – это максимальный размер массива.

В приведенной выше программе str – это имя строки, а 100 – максимальный размер массива.

Строковый объект

В С++ вы также можете создать строковый объект для хранения строк.

В отличие от массивов символов, строковые объекты не имеют фиксированной длины и могут быть расширены в соответствии с вашими требованиями.

Пример 3: с использованием строкового типа данных

В этой программе объявлена строка str . Затем строка запрашивается у пользователя.

Вместо использования функции cin >> или cin.get() вы можете получить введенную строку текста с помощью getline().

Функция getline() принимает входной поток в качестве первого параметра, то есть cin и str в качестве местоположения сохраняемой строки.

Передача строки в функцию

Строки передаются в функцию точно так же, как массивы.

В приведенной выше программе предлагается ввести две строки. Они хранятся в str и str1 соответственно, где str – массив символов, а str1 – строковый объект.

Затем у нас есть две функции display(), которые выводят строку в строку.

Единственное различие между двумя функциями – это параметр. Первая функция display() принимает в качестве параметра массив символов, а вторая – строку. Этот процесс известен как перегрузка функции.

Похожие статьи