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

от admin

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

Для ввода данных в консоли может использоваться функция scanf() . Эта функция определена в заголовочном файле stdio.h (там же, где и функция printf) и имеет следующее формальное определение:

И форматная_строка, и аргументы для функции scanf обязательны.

Форматная_строка содержит спецификации преобразования, которые определяют вводимые данные. Общий вид спецификаций преобразования:

Из этих элементов обязательны только два: знак процента % и спецификатор.

Спецификатор определяет тип вводимых данных:

%c : считывает один символ

%d : считывает десятичное целое число

%i : считывает целое число в любой системе (десятичной, шестнадцатеричной, восьмеричной)

%u : считывает положительное целое число

%e : считывает число с плавающей точкой в экспоненциальной форме

%E : считывает число с плавающей точкой в экспоненциальной форме с заглавным символом экспоненты

%f : считывает число с плавающей точкой

%F : считывает число с плавающей точкой

%g : считывает число с плавающей точкой

%G : считывает число с плавающей точкой

%o : считывает восьмеричное число

%x : считывает шестнадцатеричное число

%X : считывает шестнадцатеричное число

%s : считывает строку

%% : считывает символ процента

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

Ширина_поля представляет целое положительное число, которое позволяет определить, какое количество байтов будет учитываться при вводе.

Модификаторы позволяют конкретизировать тип данных. В частности, есть следующие модификаторы:

h : для ввода значений типа short int ( %hd )

l : для ввода значений типа long int ( %ld ) или double ( %lf , %le )

L : для ввода значений типа long double ( %Lf , %Le )

В качестве аргументов в функцию scanf() передаются адреса переменной, которая будет получать введенное значение. Для получения адреса переменной перед ее именем ставится знак амперсанда & . Например, если переменная называется age , то ее адрес мы можем получить с помощью выражения &age .

Например, введем с консоли числовое значение:

Здесь вводится значение для переменной age, которая представляет тип int , поэтому в форматную строку в функции scanf передается спецификатор %d . Здесь не используется ни символ звездочки, ни ширина поля, ни модификаторы. Вторым параметром идет адрес переменной age — &age .

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

Аналогичен будет ввод данных других типов:

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

Можно сразу вводить несколько значений. В этом случае в качестве разделителя используется пробел:

При вводе данных в консоли функция scanf может использовать пробелы в качестве разделителей, чтобы выдернуть из ввода значения для определенных переменных. Консольный ввод-вывод:

Ввод строк

Функция scanf() также позволяет вводить строки. Например:

Здесь для имени выделяется 10 символов. Теоретически мы можем ввести и большее количество символов, но чтобы только 10 из них учитывались, в строку форматирования передается ширина поля, которая представляет 10 символов — %10s . Когда функция считает достаточное количетсво символов, она прекратит считывание.

Обратите внимание, что для ввода строки перед названием переменной не указывается символ адреса.

Потому что название массива уже само по себе представляет адрес на первый элемент массива.

Возможный консольный вывод:

Однако при использовании этой функции мы можем столкнуться с рядом проблем. Прежде всего попробуйте ввести в предыдущем примере составное имя, в которм подстроки разделены пробелами, например, «Tom Smith».

Для решения этой проблемы можно использовать один хак:

Спецификатор %10[^\n] указавает, что мы по прежнему считываем неболее 10 символов. Квадратные скобки [] представляют позволяют определить набор символов, которые будут извлекаться из ввода или, наоборот, игнорироваться. Так, выражение [^\n] говорит, что надо считать ввод до тех пор пока не встретиться символ перевода строки ‘\n’, то есть пока пользователь не нажмет на клавишу Enter.

std::cin input with spaces?

The user wants to enter «Hello World». But cin fails at the space between the two words. How can I make cin take in the whole of Hello World ?

I’m actually doing this with structs and cin.getline doesn’t seem to work. Here’s my code:

This yields an error. Any ideas?

8 Answers 8

It doesn’t "fail"; it just stops reading. It sees a lexical token as a "string".

Note that this is not the same as std::istream::getline , which works with C-style char buffers rather than std::string s.

Update

Your edited question bears little resemblance to the original.

You were trying to getline into an int , not a string or character buffer. The formatting operations of streams only work with operator<< and operator>> . Either use one of them (and tweak accordingly for multi-word input), or use getline and lexically convert to int after-the-fact.

Функции обработки строк в Cи

В программе строки могут определяться следующим образом:

  • как строковые константы;
  • как массивы символов;
  • через указатель на символьный тип;
  • как массивы строк.

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

Любая последовательность символов, заключенная в двойные кавычки «» , рассматривается как строковая константа .

Для корректного вывода любая строка должна заканчиваться нуль-символом '\0' , целочисленное значение которого равно 0. При объявлении строковой константы нуль-символ добавляется к ней автоматически. Так, последовательность символов, представляющая собой строковую константу, будет размещена в оперативной памяти компьютера, включая нулевой байт.

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

Для помещения в строковую константу некоторых служебных символов используются символьные комбинации. Так, если необходимо включить в строку символ двойной кавычки, ему должен предшествовать символ «обратный слеш»: ‘\»‘ .

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

При определении массива символов необходимо сообщить компилятору требуемый размер памяти.

Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:

В этом случае имена m2 и m3 являются указателями на первые элементы массивов:

  • m2 эквивалентно &m2[0]
  • m2[0] эквивалентно ‘Г’
  • m2[1] эквивалентно ‘o’
  • m3 эквивалентно &m3[0]
  • m3[2] эквивалентно ‘x’
Читать:
Как вставить таблицу из excel в powerpoint

При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:

Для задания строки можно использовать указатель на символьный тип .

В этом случае объявление массива переменной m4 может быть присвоен адрес массива:

Здесь m3 является константой-указателем. Нельзя изменить m3 , так как это означало бы изменение положения (адреса) массива в памяти, в отличие от m4 .

Для указателя можно использовать операцию увеличения (перемещения на следующий символ):

Массивы символьных строк

Иногда в программах возникает необходимость описание массива символьных строк . В этом случае можно использовать индекс строки для доступа к нескольким разным строкам.

В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
*poet[0] эквивалентно 'П',
*poet[l] эквивалентно '-'.

Инициализация выполняется по правилам, определенным для массивов.
Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
последовательности.
Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:

Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.

Массив строк

Свободный массив

Операции со строками

Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:

  • выделить блок оперативной памяти под массив;
  • проинициализировать строку.

Для выделения памяти под хранение строки могут использоваться функции динамического выделения памяти. При этом необходимо учитывать требуемый размер строки:

Для ввода строки использована функция scanf() , причем введенная строка не может превышать 9 символов. Последний символ будет содержать '\0' .

Функции ввода строк

Для ввода строки может использоваться функция scanf() . Однако функция scanf() предназначена скорее для получения слова, а не строки. Если применять формат "%s" для ввода, строка вводится до (но не включая) следующего пустого символа, которым может быть пробел, табуляция или перевод строки.

Для ввода строки, включая пробелы, используется функция

В качестве аргумента функции передается указатель на строку, в которую осуществляется ввод. Функция просит пользователя ввести строку, которую она помещает в массив, пока пользователь не нажмет Enter.

Функции вывода строк

Для вывода строк можно воспользоваться рассмотренной ранее функцией

или в сокращенном формате

Для вывода строк также может использоваться функция

которая печатает строку s и переводит курсор на новую строку (в отличие от printf() ). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.

Функция ввода символов

Для ввода символов может использоваться функция

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

Функция вывода символов

Для вывода символов может использоваться функция

которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.

Пример Посчитать количество введенных символов во введенной строке.

Результат выполнения
Количество введенных символов в строке

Строки в 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() принимает в качестве параметра массив символов, а вторая – строку. Этот процесс известен как перегрузка функции.

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