getline(cin,aString)接收输入而不输入另一个值

getline(cin, aString) receiving input without another enter

本文关键字:输入 另一个 cin aString getline      更新时间:2023-10-16

我的代码看起来像这样,

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;

每次运行它时,我都会输入"12"、"12"answers"。

我想知道为什么getline会在没有用户输入的情况下接收。

我可以理解,当我输入类似"12 24"的东西时,cin会得到"12",而getline应该得到其余的

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

当您将标准流提取与getline混合时,有时会让getline返回空字符串。原因是,如果使用>>读取输入,则用户输入的换行符不会从输入流中删除,以表示完成了输入。因此,当您调用getline时,函数将读取剩余的换行符并返回空字符串。

要解决此问题,请始终使用getline进行输入,或者使用ws流操纵器在读取后提取额外的空白:

cin >> value >> ws;

这将吃掉换行符,从而解决问题。

希望这能有所帮助!

这就是我得到的:

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();

"cin>>x"不使用输入流中的换行符,因此使用getline检索的下一行将包含一个空字符串。解决此问题的一种方法是使用getline逐行检索输入,并使用字符串流标记每一行。从字符串流中提取所有输入后,关键是调用字符串流: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更高效。