可能重复:
需要帮助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)
添加到@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)