猿问

如图,请教一下关于C++中缓冲区提取数据问题,涉及到cin.ignore()函数!求

#include "iostream"
#include "string"
using namespace std;

void main()
{
int a,b,c;
string name;
cout<<"a:";
cin>>a;
cout<<"b:";
cin>>b;
cin.ignore(1000,'\n');
cout<<"name:";
getline(cin,name);
cout<<"c:";
cin>>c;

cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
cout<<"name:"<<name<<endl;
cout<<"c:"<<c<<endl;
}
运行发现每次输入name后不是直接让我输入c,而是处于阻塞等待我输入,此时输入回车才会跳出c:让我输入,我搞不懂为什么不是直接跳出c:让我输入???



萧十郎
浏览 223回答 2
2回答

哔哔one

所谓“阻塞等待”的原因不是因为cin.ignore(1000,'\n');,而是因为getline(cin,name);。getline(cin,name);这么写是getline(cin,name,'\n');默认简写,它必须等待接收到一个'\n'才向下走,否则继续等待;所以要在最后输入2个'\n'才能继续,就是说第一个'\n'是作为name的结束标记接收但不计入最后一个字符,第二个'\n'才是让getline从输入缓冲区读取字符的命令。你可以把getline(cin,name);改成getline(cin,name,' ');,当你输入完字符串最后一个字符后接着加一个' '再回车,立马就会出现c:让你输入c的值。这样就可以体会为什么写成getline(cin,name);,也就是getline(cin,name,'\n');会要输入两个'\n'才出现提示c:。另说一句,若不用cin.ignore(1000,'\n');,由于前面的cin >> b;会把打入的'\n'遗留在输入缓冲区,getline会把它当作字符串输入结束标记而使逻辑混乱。所以当getline(cin,name);这么写时,cin.ignore(1000,'\n');就有必要了;若写成getline(cin,name,' ');,不要cin.ignore(1000,'\n');也会正常工作(前面遗留了' '时除外,一般不会遗留' ')。

饮歌长啸

cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。你不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束,就是这样啊,所以你每次都少一个字符.
随时随地看视频慕课网APP
我要回答