Раздел: Статьи / С/С++ /

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

Быстрый старт в С++ Быстрый старт в С++

Бесплатная небольшая книга, которую не надо читать полгода, но которая покажет вам, что такое С++ и как начать его изучение. А также поможет решить, надо ли вам это вообще. Кроме того, подписавшись на рассылку, вы будете получать от меня полезные материалы по С++, которые я периодически выпускаю... Подробнее...

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

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

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

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

#include <cstdlib>
#include <iostream>

using namespace std;

string str;

int main(int argc, char** argv) 
{
  cout << "Hello! Entered string: ";
  cin >> str;
  cout << "You entered: " << str << endl;
  return 0;
}

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

100 200 300

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

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

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

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

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

cout << "Hello! Entered string: ";
getline(cin, str);
cout << "You entered: " << str << endl;

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

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

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

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

#include <cstdlib>
#include <iostream>

using namespace std;

string str;

int main(int argc, char** argv) 
{
	cout << "Hello! Entered string: ";
	cin >> str;
	cout << "You entered: " << str << endl;
	
	cout << "Hello! Entered string: ";
	getline(cin, str);
	cout << "You entered: " << str << endl;
	
	return 0;
}

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

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

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

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

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

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

cin.seekg(cin.eof());

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

_flushall();

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

#include <cstdlib>
#include <iostream>

using namespace std;

string str;

int main(int argc, char** argv) 
{
	cout << "Hello! Entered string: ";
	cin >> str;
	cout << "You entered: " << str << endl;
	
	_flushall(); //Очистить буферы
	cout << "Hello! Entered string: ";
	getline(cin, str);
	cout << "You entered: " << str << endl;
	
	return 0;
}

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

И напоследок…

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

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

using namespace std;

string str, str1, str2;

int main(int argc, char** argv) 
{
	cout << "Hello! Entered string: ";
	cin >> str >> str1 >> str2;
	cout << "You entered: " << str << str1 << str2 << endl;
	  
	return 0;
}

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

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

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

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

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


Все способы изучить С++ Все способы изучить С++

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

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика