2 回答
TA贡献1854条经验 获得超8个赞
所谓“阻塞等待”的原因不是因为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');也会正常工作(前面遗留了' '时除外,一般不会遗留' ')。
TA贡献1951条经验 获得超3个赞
cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。你不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束,就是这样啊,所以你每次都少一个字符.
添加回答
举报