读书人

c++程序中输入过滤cin.get()!=amp;#x27

发布时间: 2013-03-17 13:48:31 作者: rapoo

c++程序中,输入过滤cin.get()!='\n'的作用原理是什么?
在一些带有简单输入的C++程序中,经常在判断输入字符的语句看到,while(cin.get()!='\n') continue;这句话,在网上查了下,这句话的作用是过滤掉多余的输入,只取输入的第一个字符,可是具体的工作原理就不知道了,希望大神可以给具体的讲一下,下面带一个小例子:
---------------------------------
#include<iostream>
#include<cctype>
#include"stack.h"

int main()
{
using namespace std;
Stack st;
char ch;
unsigned long po;
cout<<"Please enter A to add purchase order, \n"
<<"P to process a PO, or Q to quit.\n";
while (cin>>ch && toupper(ch)!='Q')
{
while(cin.get()!='\n')
continue;
if(!isalpha(ch))
{
cout<<'\a';
continue;
}
switch (ch)
{
case 'A':
case 'a':cout<<"Enter PO number to add: ";
cin>>po;
if(st.isfull())
cout<<"stack already full.\n";
else
st.push(po);
break;
case 'p':
case'P':if(st.isempty())
cout<<"stack already empty\n";
else
{
st.pop(po);
cout<<"PO # "<<po<<" popped\n";
}
break;

}
cout<<"Please enter A to add a purchase order, \n"
<<"P to process a PO,or Q to quit.\n";
}
cout<<"Bye\n";
return 0;
} c++
[解决办法]
过滤掉多余的输入,只取输入的第一个字符
while(cin.get()!='\n') continue;
所谓过滤就是其它东西我不感冒,读取后全扔了,不处理!
一般来说'\n'可以结束1次输入;
这样会清空缓冲区,只有用户重新输入,才可以取到字符。
那些和前面的字符一起输入而没有输入回车的字符就不会再取到了。
那些在输入回车前输入的字符就是所谓的多余的输入,
至于是否只取输入的第一个字符,关键看处理了几个字符,如果只读取一次,取一个字符,那就是只取输入的第一个字符,否则就不是了
这个循环里,只有while语句里读取一次,取了一个字符,紧结着就是
while(cin.get()!='\n') continue;这个continue没有什么作用
因为他是内循环while(cin.get()!='\n')的语句,而while(cin.get()!='\n')只有
continue一个语句;不写也要等到while(cin.get()!='\n');执行完毕,才会向下执行。
所以看到循环了只有continue;或者break的内容的书籍或者资料赶紧,扔了吧。
至少要有一个判断语再continue或者break吧!!!
while(cin.get()!='\n') continue;就是while(cin.get()!='\n');
不要认为 while(cin.get()!='\n')没有大括号{}continue;就是外层循环的语句它是
内层循环的语句;
while(cin.get()!='\n');就可以了,这个continue;
就像这个语句想要过滤的那些字符一样是多余的!!!!!

原理很简单,每读取一个字符,判断是否'\n'(回车)不是继续直到读到回车为止,是退出循环。
while 仿真
while(expr)statement;

startwhile:
if(!eppr)goto endwhile
{
statement
goto startwhile;
}
endwhile:

while(expr){statements}

startwhile:
if(!eppr)goto endwhile
{
statements;
goto startwhile;
}
endwhile:


while(expr)continue;

startwhile:
if(!eppr)goto endwhile ;和条件相反时,退出循环;所以这里的条件和循环里的条件相反。
{
goto startwhile;//这是continue语句生成的代码
goto startwhile;//这是正常循环的代码
}
endwhile:
下面是包含continue;break;的语句组的代码,通常 continue;break;要放在if 结构里面。


while(expr){
。。。
continue;
。。。。
break;
}

startwhile:
if(!eppr)goto endwhile; 和条件相反时,退出循环;所以这里的条件和循环里的条件相反。
{
....
goto startwhile;//这是continue语句生成的代码
....
goto endwhile; //这是break;语句生成的代码

goto startwhile;//这是正常循环的代码
}
endwhile:

------解决方案--------------------


cin>>ch ; 输入流中第一个字符传递给ch

cin.get(); 获取输入流下一个字符

cin.get() != '\n' 输入流获取的下一个字符不等于回车

while(cin.get()!='\n') continue; 当输入流获取的下一个字符等于回车,中断循环。

读书人网 >C++

热点推荐