while、scanf、cin、getline控制输入

常用的语法
(1)while(scanf("%d",&n)!=EOF)
(2)while (~scanf("%d", &x))
(3)int a = 0;while (cin >> a)
(4)while((n=cin.get())!=’\n’)
(5)while(cin.get(n)&&n!=’\n’)

1、while (~scanf("%d%d",&m,&n))
功能是循环从输入流读取m和n,直到遇到EOF为止,等同于while (scanf("%d%d",&m,&n)!=EOF)。

scanf()函数返回成功赋值的数据项数,出错时则返回,EOF定义为-1。~是按位取反,-1十六进制补码表示为0x ffffffff,f是二进制的1111,取反后就全部变成0了,于是while结束。~0的值为-1,即只有返回值为EOF(即-1)时,其取反的的值(即while循环的判断条件)才为0,才能结束循环,其它输入情况下(无论是否输入成功)while循环的判断条件为非0,即为真。
  这种写法的漏洞在于:一但输入的值为字母、符号之类的,scanf赋值不成功把读到的内容又返回到stdin的缓冲区(假设这个值为t),其取反得到的值使while又进入到下一次循环,scanf又从stdin缓冲区里读到了原先吐回的t,如此成了死循环……
  2、scanf返回的是成功扫描进的数的个数。如scanf("%d %d",&a, &b),若a、b都输入成功返回2,成功一个返回1,都不成功返回0,错误返回-1。故while(scanf("%d",&n)!=EOF) 即成功输入,没有出错。
例如:要你多组输入,当输入为0时结束程序,
1).while(scanf("%d",&n)) //当n有输入时
{if(n==0) //如果n=0
break; } //程序结束
2).while(~scanf("%d",&n)&&n!=0)

百分号(%)与格式符之间的星号(*)表示读指定类型的数据但不保存。因此, scanf( “%d %*c %d”, &x, &y );只读入x,y
  3、while(cin>>str)与cin.get() cin.getline()、getline()、gets()、cin.get(),getchar()的区别
  #include
string str1;
char str2[100];
cin >> str1;
cin >> str2;//cin以空格和回车为结束符
char ch;
cin.get(ch);//用来接收一个字符
char str[20];
cin.get(str, 20);//接收一行字符串,可以接收空格
char str[20];
cin.getline(str, 20);//接收一行字符串,可以接收空格
cin.getline(str, 20, ‘#’);//接收一行字符串,可以接收空格,判断直到遇到’#'为止
#include
string s;
getline(cin, s);//接收一行字符串
//getline()和cin.getline()很类似,
cin.getline()属于istream流,需要包含头文件
//而getline()属于string流,需要包含头文件,是不一样的两个函数char str[20];
gets(str);//接收一行字符串到字符数组里面
//gets使用的时候编译器可能会产生警告:warning: this program uses gets(), which is unsafe. 所以建议使用cin.getline()
char ch;
ch = getchar();//不能写成getchar(ch);

猜你喜欢

转载自blog.csdn.net/weixin_43719397/article/details/84388372