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

Muh*_*aid 18 c++ char getline

可能重复:
需要帮助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");
}
Run Code Online (Sandbox Code Playgroud)

好像我getline()在输入之上使用它确实有效

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

可能是什么原因?

P.P*_*.P. 35

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

cin.getline()从输入读取,还有剩余的输入流中的换行字符,所以它不读取你的c-字符串.使用cin.ignore()beore call getline().

cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);
Run Code Online (Sandbox Code Playgroud)

  • 这是非常重要的事情,在许多解释 getline 功能的网站中都没有提到。 (3认同)

jro*_*rok 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";
    }
}
Run Code Online (Sandbox Code Playgroud)