可能重复:
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;
可能是什么原因?
答案 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>>
)可能会失败。如果是,则将流标记为“不良”(failbit
,badbit
或eofbit
已设置)。一旦“坏”,除非您清除状态,否则该流上的所有后续流提取都将失败。
学会成为一个偏执的程序员。始终检查那些格式化输入操作的状态。您可以,例如抛出异常,或打印错误消息并退出。你不应该做的一件事就是简单地假设它有效。