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

Why doesn't this code correctly read strings until encountering a newline?

我正在尝试编写一个程序,从用户那里读取一堆字符串,然后是换行符,然后将我读取的所有字符串压入堆栈。这是我目前拥有的:

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

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

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

如果你想读取一堆字符串直到换行,你可以考虑使用 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;
}

尝试

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")