耐心看完这几个例子会很有收获
例.1 .
#include <stdio.h>
int main()
{
char c;
int n = 0;
while ((c=getchar())!='a')
{
printf("%c,%d",c, n);
}
return 0;
}
1.
输入:
ssss回车
得到:
ssss
光标处(等待输入)
其实循环执行了五次,前四次输出s,第五次输出的是回车,所以才会出现:输出ssss后下一行的光标出(等待输入)
2.如果我们输入:
ssssa回车
得到:
ssss
循环执行四次
例.2 .
#include <stdio.h>
int main()
{
char c;
while ((c = getchar()) != 'a')
printf("%c",c);
getchar();
c=getchar();
printf("%c",c);
return 0;
}
1.输入:
ssss回车
得到:
ssss
光标处(等待输入)
其实循环执行了五次,前四次输出s,第五次输出的是回车(缓冲区储存了
ssss回车五个字符),所以才会出现:输出ssss后下一行的光标出(等待输
入)
说明:此时程序没有结束,进行到while循环,因为并没有字符a出现,所以还没跳出
while循环.键入回车后,getchar依次从缓冲区内取出(while循环):’s”s”s”s”/n’
2.
如果我们输入:
ssssa回车
得到:
ssss光标处(等待输入)
说明:程序已经跳出while循环,但是由于我们用getchar();清除了换行’/n’,后
面第7句c=getchar();需要你输入一个字符(因为ssssa后面并没有新的字
符),所以程序仍然没有结束.如果我们注释掉getchar();这一句,代码如下:
```
#include <stdio.h>
int main()
{
char c;
while ((c = getchar()) != 'a')
printf("%c",c);
//getchar();
c=getchar();
printf("%c",c);
return 0;
}
如果我们输入:
ssssa回车
得到
ssss
光标处(程序结束)
这个输入ssssa是的回车中的换行符’/n’就被c=getchar();这一句读取并输出了。
例3.
#include <stdio.h>
int main()
{
char ch;
while ((ch = getchar()) != '#')
printf("Fine.");
return 0;
}
1.输入:
1234回车
得到:
Fine.Fine.Fine.Fine.Fine.光标处(等待输入)
说明:ch依次被赋值1234回车,注意回车刷新缓冲区的同时也被赋值给ch,这个五个字符均不是‘#’故运行了五次,仍为跳出循环。
2.输入:
1234#回车
得到:
Fine.Fine.Fine.Fine.光标处(程序结束)
说明:ch依次被赋值1234#回车,循环执行到#时候跳出,故循环只执行4此。
例4.想办法吃掉回车法1‘\n’
#include <stdio.h>
int main()
{
char ch;
while ((ch = getchar()) != '#')
{
getchar();//吃掉回车
printf("Fine.");
}
return 0;
}
1.输入:
1回车
得到:
Fine.光标处(等待输入)
说明:把1赋值给ch后,回车刷新缓冲区并把值给了getchar();//吃掉回车。
!!注意:这样只适合单个输入数据的,比如1回车,a回车这种。
如果同时输入两个数12回车,结果如下:
2.输入:
12回车
得到:
Fine.光标处(等待输入)
说明:ch其实只接收了1和回车,流程如下,
1赋值给了ch执行循环、
2被getchar()// 吃掉回车 这个语句吃掉了
输出Fine.这个时候ch = 1
第二次循环,
回车的值被赋予了ch
执行到getchar()// 吃掉回车 这个语句时就会继续等待输入。
3.输入:
123回车
得到:
Fine.Fine.光标处(等待输入)
说明:实际上ch只接收了1和3 的值,2和回车都被getchar()// 吃掉回车 这个语句吃掉了,运行流程如下:
1被赋值给ch执行循环
2被getchar()// 吃掉回车 吃掉了
输出Fine.
3被赋值给ch执行循环
回车被getchar()// 吃掉回车 吃掉了
输出Fine.继续等待输入ch的值
从例4的2 和3 可以看出此法会吞掉我们的数据,除单独输入如1回车,b回车这种情况外不建议使用。
例5. 想办法吃掉回车法1 ‘\n’
#include <stdio.h>
int main()
{
char ch;
while ((ch = getchar()) != '#')
{
if (ch == '\n')
continue;
printf("Fine.");
}
return 0;
}
1
输入:
1回车
得到:
Fine.光标处(等待输入)
执行流程如下:
1被赋值给ch
判断是不是回车
不是回车输出Fine.
回车被赋予ch,判断是不是空格,是空格,直接执行下一次循环判断条件也就是出现了 光标处(等待输入)
2.
输入:
123回车
得出;
Fine.Fine.Fine.光标处(等待输入)
说明:程序依次被赋值123回车,流程如下
1被赋值给ch
进入循环体内判断 ch是否是回车,不是回车 输出 Fine.
2被赋值给ch
进入循环体内判断 ch是否是回车,不是回车 输出 Fine.
3被赋值给ch
进入循环体内判断 ch是否是回车,不是回车 输出 Fine.
回车赋值给ch
进入循环体内判断ch是否是回车,是回车,直接执行下一次循环的判断条件,也就是光标处(等待输入)。