我试图编写一个程序,从用户读取一串字符串,然后是换行符,并将我读过的所有字符串推送到堆栈中。这就是我到目前为止所拥有的:
stack<string> st;
string str;
while(str != "\n")
{
cin >> str;
st.push(str);
}
但是,这会进入一个无限循环,并且在我读取换行符时不会停止。为什么会这样?我该如何解决?
答案 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")