33

可能重复:
在 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;

可能是什么原因?

4

3 回答 3

65

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

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

cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);
于 2012-10-02T13:44:54.337 回答
10

添加到@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";
    }
}
于 2012-10-02T13:45:29.667 回答
2

您没有检查流状态。流std::cin提取运算符 ( operator>>) 可能会失败。当它发生时,流被标记为“坏”(failbitbadbiteofbit已设置)。一旦“坏”,除非您清除状态,否则对该流的所有后续流提取都将失败。

学习成为一个偏执的程序员。始终检查那些格式化输入操作的状态。例如,您可以抛出异常,或打印错误消息并退出。你不应该做的一件事是简单地假设它有效。

于 2012-10-02T13:40:21.583 回答