在C++中使用getline()函数

54

我使用getline方法获取用户输入,但遇到了问题,我的代码类似于:

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

然而,它并没有停止获取输出值,这是怎么回事?


4
你展示的三行没有问题。你可能希望编辑你的问题,增加一些更多的背景信息? - Some programmer dude
2
http://stackoverflow.com/search?q=%5Bc%2B%2B%5D%20getline%20skipping - chris
这是你的全部代码吗?之后你还会对messageVar进行任何操作吗? - Paddyd
1
很可能在之前的输入中流中留下了一个 '\n' - jrok
是的,我将值注册到数据库中,我之前使用的是cin >> messageVar,但那只是逐个“单词”捕获句子。 - MGE
7个回答

104
如果在使用cin >> something之后,你要使用getline(),则需要在两者之间清除缓冲区中的换行符。你可以使用cin.ignore()来完成此操作。
代码示例如下:
string messageVar;
cout << "Type your message: ";
cin.ignore(); 
getline(cin, messageVar);

这是因为 >> 运算符在输入缓冲区中留下了一个换行符 \n。当您进行未格式化的输入,例如使用 getline() 读取输入直到找到换行符时,这可能会成为问题。如果发生这种情况,它会立即停止读取,因为在您之前的操作中留下了那个悬挂的 \n

什么是“未格式化输入”,它与getline()有什么关系? - Minh Tran
此外,是否有另一种方法可以实现与上述代码相同的行为,而不使用cin、cin.ignore()和getline()函数? - Minh Tran

6
如果您的输入中只有一个换行符,那么只需执行以下操作:
std::cin.ignore();

这将很好地工作。它从输入中读取并丢弃下一个字符。

但是,如果您在输入中还有其他内容(除了换行符之外,例如,您读取了一个单词,但用户输入了两个单词),则必须执行以下操作:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

参见例如ignore函数的参考文献

为了更加安全,使用第二种替代方法,并在循环中执行,直到gcount返回零。


3

我有类似的问题。唯一的缺点是,使用cin.ignore()时,您需要再按一次回车键,这会影响程序。


2
int main(){
.... example with file
     //input is a file
    if(input.is_open()){
        cin.ignore(1,'\n'); //it ignores everything after new line
        cin.getline(buffer,255); // save it in buffer
        input<<buffer; //save it in input(it's a file)
        input.close();
    }
}

1

我知道我来晚了,但希望这对你有用。 逻辑是针对用户想要输入多行的情况,一次只处理一行。

int main() 
{ 
int t;                    // no of lines user wants to enter
cin>>t;
string str;
cin.ignore();            // for clearing newline in cin
while(t--)
{
    getline(cin,str);    // accepting one line, getline is teminated when newline is found 
    cout<<str<<endl; 
}
return 0; 
} 

输入

3

贝汉普尔政府学院

谢拉姆普尔纺织学院

贝汉普尔谢拉姆普尔

输出

贝汉普尔政府学院

谢拉姆普尔纺织学院

贝汉普尔谢拉姆普尔


-1
我想你在程序结束前没有暂停,所以在获取输入后输出的内容没有显示在屏幕上,对吗?
做:
getchar();

程序结束之前

我认为这个答案是针对Windows的,通常在返回时会终止控制台。我相信它不适用于这个问题? - GCon

-1
代码是正确的。问题必须出在其他地方。尝试使用std::getline文档中的最简示例。
main ()
{
    std::string name;

    std::cout << "Please, enter your full name: ";
    std::getline (std::cin,name);
    std::cout << "Hello, " << name << "!\n";

    return 0;
}

我尝试了你的代码,输入被插入到“name”对象中,但我无法使用它来打印“hello name”。有什么想法吗? - user3165438
当然可以。我刚试过了,它完全正常工作。你具体遇到了什么问题? - Konstantin
不,这样做没有解决问题。正如上面的人所描述的那样,问题在于当getline()跟随使用cin的另一个输入时,输入缓冲区中仍然存在换行符。给出的最小示例没有在getline()之前输入任何内容,因此当然无法重现原帖作者所询问的问题。 - gleedadswell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接