C ++: Почему пробел всегда завершает строку при чтении? - PullRequest
6 голосов
/ 01 июня 2010

Используя тип std::string, чтобы принять предложение, для практики (я не много работал со строками в C ++) Я проверяю, является ли символ гласным или нет. Я получил это:

for(i = 0; i <= analyse.length(); i++) {
if(analyse[i] == 'a' || analyse[i] == 'e' [..etc..]) {
 ...vowels++;    
} else { ...
 ...consonants++;
}

Это прекрасно работает, если строка состоит из одного слова, но после добавления пробела (IE: aeio aatest ) он будет считать только первый блок и будет считать пробел как согласную и завершится чтение предложения (выход из цикла for или что-то в этом роде).

Считается ли пробел без символа == ноль? Или какая-то странность с std::string ?, Было бы полезно узнать, почему это происходит!

EDIT: Я просто принимаю строку через std :: cin, например:

std::string analyse = "";
std::cin >> analyse;

Ответы [ 4 ]

9 голосов
/ 01 июня 2010

Я предполагаю, что вы читаете свою строку с чем-то вроде your_stream >> your_string;. Оператор >> для строк определен для работы (примерно) так же, как scanf преобразование %s, которое считывает до тех пор, пока не встретит пробел, поэтому operator>> делает то же самое.

Вместо этого вы можете прочитать всю строку ввода с помощью std::getline. Вы также можете посмотреть ответ , который я отправил на предыдущий вопрос (предоставляет несколько альтернатив std::getline).

4 голосов
/ 01 июня 2010

Я не могу сказать по коду, который вы вставили, но я собираюсь выйти из строя и предположить, что вы читаете строку, используя оператор извлечения потока (stream >> string). 1001 *

Оператор извлечения потока останавливается при обнаружении пробела.

Если это не то, что происходит, можете ли вы показать нам, как вы заполняете свою строку и каково ее содержимое?

Если я прав, то вам понадобится другой метод чтения содержимого в строку. std :: getline (), вероятно, самый простой способ чтения из файла. Он останавливается на новых строках вместо пробелов.


Редактировать на основе отредактированного вопроса: используйте это (перепроверьте синтаксис. Я не перед моим компилятором.):

std::getline(std::cin, analyze); 

Это должно остановить чтение, когда вы нажимаете «ввод».

2 голосов
/ 01 июня 2010

Если вы хотите читать всю строку (включая пробелы), вам следует читать, используя getline. Схематически это выглядит так:

#include <string>
istream& std::getline( istream& is, string& s );

Чтобы прочитать всю строку, вы делаете что-то вроде этого:

string s;
getline( cin, s );
cout << "You entered " << s << endl;

PS: слово «согласный», а не «согласный».

1 голос
/ 01 июня 2010

Оператор >> в istream разделяет строки в пробелах.Если вы хотите получить целую строку, вы можете использовать readline(cin,destination_string).

...