为什么这段代码在遇到换行符之前没有正确读取字符串?

时间:2017-09-17 20:56:56

标签: c++ string iostream

我试图编写一个程序,从用户读取一串字符串,然后是换行符,并将我读过的所有字符串推送到堆栈中。这就是我到目前为止所拥有的:

stack<string> st;
string str;
while(str != "\n")
{
    cin >> str;
    st.push(str);
}

但是,这会进入一个无限循环,并且在我读取换行符时不会停止。为什么会这样?我该如何解决?

2 个答案:

答案 0 :(得分:1)

默认情况下,应用于字符串的流提取运算符(>>运算符)将跳过所有空格。如果您输入A B C,然后输入换行符,然后D E F,然后尝试使用流提取运算符一次读取一个字符串,您将获得字符串&#34; A&#34 ;,&#34; B&#34;,&#34; C&#34;,&#34; D&#34;,&#34; E&#34;和&#34; F&#34;没有空格,没有换行符。

如果您想在阅读换行符之前阅读一堆字符串,可以考虑使用std::getline读取一行文字,然后使用std::istringstream对其进行标记:

#include <sstream>

/* Read a full line from the user. */
std::string line;
if (!getline(std::cin, line)) {
    // Handle an error
}

/* Tokenize it. */
std::istringstream tokenizer(line);
for (std::string token; tokenizer >> token; ) {
   // Do something with the string token
}

作为注释 - 在原始代码中,您有一个通常如下所示的循环:

string toRead;
while (allIsGoodFor(toRead)) {
    cin >> toRead;
    // do something with toRead;
}

这种方法通常不起作用,因为它会在循环中持续一次太多。具体来说,一旦您读取导致条件为假的输入,循环将继续处理您到目前为止所读取的内容。做这样的事情可能是个更好的主意:

while (cin >> toRead && allIsGoodFor(toRead)) {
    do something with toRead;
}

答案 1 :(得分:-2)

尝试

stack<string> st;
string str;
while(str!="\n")
{
cin>>str;
if(str == "\n")
{
break;
}
st.push(str);
}

看看是否有效。 如果没有,那么试试

while ((str = cin.get()) != '\n')

而不是

while(str!="\n")