C ++:为什么空格总是在读取时终止字符串?

时间:2010-06-01 03:57:54

标签: c++ string std

使用类型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循环或其他东西)。

空格是否计为无字符== null?或者与std::string有点奇怪?,知道为什么会发生这种情况会很有帮助!

编辑: 我只是通过std :: cin接受字符串,例如:

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

4 个答案:

答案 0 :(得分:9)

我猜你正在用your_stream >> your_string;之类的东西读你的字符串。字符串的运算符>>被定义为与scanf的{​​{1}}转换相同(大约),它会在遇到空格时读取 - 因此,%s执行相同。

您可以使用operator>>读取整行输入。您可能还想查看我发布到上一个问题的answer(提供std::getline的一些替代方法)。

答案 1 :(得分:4)

我无法从代码中看出你已经粘贴了,但是我会想出你正在使用流提取操作符读取字符串(stream&gt;&gt; string)

流提取操作符在遇到空格时停止。

如果这不是正在发生的事情,你能告诉我们你是如何填充你的字符串,以及它的内容是什么?

如果我是对的,那么你会想要一种不同的方法来读取字符串中的内容。 std :: getline()可能是从文件中读取最简单的方法。它停在换行符而不是空格处。


根据已修改的问题进行修改: 使用它(双重检查语法。我不在我的编译器前面。):

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

当你按“输入”时,这应该停止阅读。

答案 2 :(得分:2)

如果您想要读取整行(包括空白),那么您应该使用getline阅读。示意性地看起来像这样:

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

要阅读整行,你可以这样做:

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

PS:这个词是“辅音”,而不是“辅音”。

答案 3 :(得分:1)

istream上的>>运算符分隔空格上的字符串。如果您想获得整行,可以使用readline(cin,destination_string)