C++: Почему пространство всегда завершает строку, когда считано?

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

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

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

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

Править: Я просто принимаю строку через станд.:: cin, такой как:

std::string analyse = "";
std::cin >> analyse;
6
задан egrunin 1 June 2010 в 04:10
поделиться

4 ответа

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

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

9
ответ дан 8 December 2019 в 14:41
поделиться

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

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

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

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


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

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

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

4
ответ дан 8 December 2019 в 14:41
поделиться

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

1
ответ дан 8 December 2019 в 14:41
поделиться

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

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

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

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

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

2
ответ дан 8 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: