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

Posted

技术标签:

【中文标题】C ++:为啥读取时空格总是终止字符串?【英文标题】:C++: Why does space always terminate a string when read?C ++:为什么读取时空格总是终止字符串? 【发布时间】:2010-06-01 03:57:54 【问题描述】:

使用类型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;

【问题讨论】:

不是std::string,它可以容纳任何字符,包括空格和空值。显示您在字符串中的阅读方式。 你如何设置analyse?如果你cout &lt;&lt; analyse.length(),你会得到什么?字符串“aecio”的计数是否正确?也许问题出在 else 块的 ... 部分? 另一方面.. 将长度存储在变量中 (const int ci = analyse.length();) for 中的函数是不好的做法。 【参考方案1】:

我猜你正在用your_stream &gt;&gt; your_string; 之类的东西读取你的字符串。用于字符串的运算符 &gt;&gt; 被定义为(大约)与 scanf%s 转换一样工作,后者会一直读取直到遇到空格——因此,operator&gt;&gt; 也是如此。

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

【讨论】:

感谢您的回答链接,+1【参考方案2】:

我无法从您粘贴的代码中看出,但我会冒昧地猜测您正在使用流提取运算符(流 >> 字符串)读取字符串。

流提取运算符在遇到空格时停止。

如果不是这样,您能否向我们展示您是如何填充字符串的,以及它的内容是什么?

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


根据已编辑的问题进行编辑: 使用这个(仔细检查语法。我不在我的编译器前面。):

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

当你按下“enter”时,这应该会停止阅读。

【讨论】:

【参考方案3】:

如果您想阅读整行(包括空格),那么您应该使用 getline 阅读。示意图如下所示:

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

要阅读整行,请执行以下操作:

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

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

【讨论】:

getline 工作正常。很高兴这不是随机问题,帮助我学习。【参考方案4】:

istream 上的 &gt;&gt; 运算符用于分隔空格上的字符串。如果你想得到一整行,你可以使用readline(cin,destination_string)

【讨论】:

也许您打算使用getline 而不是readline?虽然有些库包含名为 readline 的函数,但它不是标准库的一部分。 是的,我确实打算使用 getline。 (而且使用 readline 的是其他 语言,这就是我感到困惑的原因。)

以上是关于C ++:为啥读取时空格总是终止字符串?的主要内容,如果未能解决你的问题,请参考以下文章

C语言文件操作为啥这个文件读取进入死循环了?

为啥连接终止

为啥 tableview rowAtindexpath 中的 viewWithTag 总是为零?

如下:为啥C语言读取文件中的数据并输出时有乱码出现?本来输入的是数字,然后从文件中读取后就变汉字

为啥C语言输出文件内容乱码

为啥需要空终止符?