2010-06-01 2 views
6

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

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

Это прекрасно работает, если строка все одно слово, но второй я добавить пробел (IE: AEIO AATest) он будет рассчитывать только первый блок и посчитайте пространство как согласен и перестает читать предложение (выходя из цикла for или что-то еще).

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

EDIT: Я просто принять строку через станд :: КИН, такие как:

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

Это не std :: string, которая может содержать любой символ, включая пробелы и нули. Покажите, как вы читаете строку. –

+0

Как вы настраиваете 'анализ'? Что вы получаете, если вы 'cout << analyse.length()'? Правильно ли подсчет строки «aecio»? Может быть, проблема в части '...' блока else? –

+1

на стороне .. сохранить длину в переменной (const int ci = analyse.length();) функции в for - плохая практика. – baash05

ответ

9

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

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

+0

Спасибо за ответ, +1 – Nullw0rm

4

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

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

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

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


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

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

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

2

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

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

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

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

PS: слово "согласный", а не "consenent".

+0

getline отлично работает. Рад, что это не какая-то случайная проблема, помогает мне учиться. – Nullw0rm

1

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

+0

Возможно, вы намеревались 'getline', а не' readline'? Хотя есть библиотеки, которые включают функции с именем 'readline', это не часть стандартной библиотеки. –

+0

Да, я действительно хотел получить getline. (И это другие ** языки **, которые используют readline, и именно поэтому я сбиваюсь с толку.) –