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 << analyse.length()
,你会得到什么?字符串“aecio”的计数是否正确?也许问题出在 else 块的 ...
部分?
另一方面.. 将长度存储在变量中 (const int ci = analyse.length();) for 中的函数是不好的做法。
【参考方案1】:
我猜你正在用your_stream >> your_string;
之类的东西读取你的字符串。用于字符串的运算符 >>
被定义为(大约)与 scanf
的 %s
转换一样工作,后者会一直读取直到遇到空格——因此,operator>>
也是如此。
您可以使用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 上的 >>
运算符用于分隔空格上的字符串。如果你想得到一整行,你可以使用readline(cin,destination_string)
。
【讨论】:
也许您打算使用getline
而不是readline
?虽然有些库包含名为 readline
的函数,但它不是标准库的一部分。
是的,我确实打算使用 getline。 (而且使用 readline 的是其他 语言,这就是我感到困惑的原因。)以上是关于C ++:为啥读取时空格总是终止字符串?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 tableview rowAtindexpath 中的 viewWithTag 总是为零?