getline(cin,aString)在没有其他输入的情况下接收输入

时间:2012-02-23 19:05:54

标签: c++ string getline cin

我的代码看起来像这样,

string aString;
cin >> aString;
cout << "This is what cin gets:" << aString << endl;
getline(cin, aString);
cout << "This is what getline(cin, <string>) gets:" << aString << endl;

每次我运行时,我都会提供输入,例如&#34; 12&#34;,我得到&#34; 12&#34;和&#34;&#34;。

我想知道为什么没有用户输入就会收到getline。

我可以理解当我输入类似于&#34; 12 24&#34;,cin将得到&#34; 12&#34;和getline应该得到其余的。 (另外,如果一个人可以回答,其间的空间被视为cin的结尾,那么为什么它会被传递给getline?)

刚开始使用C ++上的字符串,所以请不要太难。谢谢你。

3 个答案:

答案 0 :(得分:12)

当您使用getline混合标准流提取时,有时候getline会返回空字符串。这样做的原因是,如果您使用&gt;&gt;读取输入,则用户输入的用于表示已完成输入的换行符不会从输入流中删除。因此,当您调用getline时,该函数将读取剩余的换行符并将空字符串移回。

要解决这个问题,要么始终使用getline作为输入,要么在读取后使用ws流操纵器提取额外的空格:

cin >> value >> ws;

这会占用新线,解决问题。

希望这有帮助!

答案 1 :(得分:7)

这就是我得到的:

std::string str;
std::cin >> str;  //hello world
std::cout << str;  //hello

这是因为流操作符在空格上进行标记

std::string str;
std::getline(std::cin, str);  //hello world
std::cout << str;  //hello world

你得到整行,getline()一直工作,直到它找到第一行结束并将该值作为字符串返回。

然而,当标记化时,如果流中还有字符(例如'\ n'),那么在调用getline时将访问这些字符,您将需要清除该流。

std::cin.ignore();

答案 2 :(得分:1)

“cin&gt;&gt; x”不会使用输入流中的换行符,因此使用getline检索的下一行将包含空字符串。解决此问题的一种方法是使用getline逐行检索输入并使用字符串流来标记每一行。从字符串流中提取所有输入后,关键是调用stringstream :: clear()来清除字符串流上设置的EOF标志,以便以后在代码中重用它。

以下是一个例子:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main() {
    string line;
    stringstream ss;
    getline(cin, line);
    ss << line;
    int x, y, z;
    //extract x, y, z and any overflow characters
    ss >> x >> y >> z >> line;
    ss.clear();
    //reuse ss after clearing the eof flag
    getline(cin, line);
    ss << line;
    //extract new fields, then clear, then reuse
    //...
    return 0;
}

根据每个输入行的长度,一次获取整行并在内存中处理它可能比在要从标准输入中提取的每个令牌上执行控制台IO更有效。