getline()在一些输入之后使用无法工作

43

可能是重复问题:
需要使用getline()的帮助

如果我在输入一些内容之后使用getline(),它不起作用。

#include<iostream>
using namespace std;

main()
{
string date,time;
char journal[23];


cout<<"Date:\t";
cin>>date;
cout<<"Time:\t";
cin>>time;

cout<<"Journal Entry:\t";
cin.getline(journal,23);


cout<<endl;
system("pause");
}

然而,如果我在输入之上使用getline(),它会起作用,即:

cout<<"Journal Entry:\t";
cin.getline(journal,23);
cout<<"Date:\t";
cin>>date;
cout<<"Time:\t";
cin>>time;

可能的原因是什么?

1
请定义“不起作用”。您期望的结果是什么,而实际得到了什么? - Fred Foo
3个回答

80

提取字符,直到提取了(n - 1)个字符或者找到分隔符(如果指定了这个参数,则为分隔符,否则为'\n')。如果在输入操作期间达到文件的结尾或发生错误,提取也会停止。

cin.getline()从输入流中读取时,在输入流中会留下一个换行符,因此它不会读取你的C字符串。在调用getline()之前,请使用cin.ignore().

cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);

1
“int”仍然导致“getline()”出现问题,这是怎么回事? - Asif Mushtaq
5
这是非常重要的事情,在许多解释getline功能的网站上都没有提到。 - ViruMax

13

补充@DavidHammen所说的内容:

提取操作会在流中留下尾随的'\n'字符。另一方面,istream::getline()会丢弃它。因此,当您在提取运算符后调用getline时,'\n'是它遇到的第一个字符,并且停止在那里读取。

getline调用提取之前,请添加以下内容:

cin.ignore()

更健壮的输入方式可能类似于这样:

while (true) {

    cout<<"Time:\t";
    if (cin>>time) {
        cin.ignore();  // discard the trailing '\n'
        break;
    } else {
        // ignore everything or to the first '\n', whichever comes first
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.clear();  // clear the error flags
        cout << "Invalid input, try again.\n";
    }
}

2
您没有检查流状态。std::cin的流提取运算符(operator>>)可能会失败。当它失败时,流会标记为“坏”(failbit、badbit或eofbit被设置)。一旦出现问题,该流上的所有后续流提取操作都将失败,除非您清除其状态。
学会成为一个多疑的程序员。始终检查这些格式化输入操作的状态。例如,您可以抛出异常或打印错误消息并退出。唯一不应该做的是简单地假设它已经成功。

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