如果在某些输入后使用,则getline()不起作用

时间:2012-10-02 13:33:34

标签: c++ char getline

  

可能重复:
  Need help with 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;

可能是什么原因?

3 个答案:

答案 0 :(得分:33)

  

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

cin.getline()从输入中读取时,输入流中会留下换行符,因此它不会读取您的c-string。使用cin.ignore() beore调用getline()

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

答案 1 :(得分:6)

添加@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 :(得分:2)

您没有检查流状态。 std::cin流提取运算符(operator>>)可能会失败。如果是,则将流标记为“不良”(failbitbadbiteofbit已设置)。一旦“坏”,除非您清除状态,否则该流上的所有后续流提取都将失败。

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