#include<stdio.h>
int main()
{
int a,b;
a=getchar();
printf("%d",a);
getchar(); //回收回车
scanf("%c",&b);
printf("%d",b);
return 0;
}
运行结果
a //输入a值
970 //输出a值,输入b值(0)
48 //输出b值
[Process completed - press Enter]下面这个为缺失垃圾回收的该代码段及其运行结果
#include<stdio.h> int main() { int a,b; a=getchar(); printf("%d",a); scanf("%c",&b); printf("%d",b); return 0; }
运行结果
a //输入a值
9710 //输出a值,此处的回车就是垃圾字符,无法给变量b赋值
[Process completed - press Enter]
以上为getchar函数输入案例,下面这个是scanf函数输入案例
#include<stdio.h>
int main()
{
char a,b;
scanf("%c",&a);
printf("%d",a);
getchar(); //回收回车
scanf("%c",&b);
printf("%d",b);
return 0;
}
运行结果
a //输入a值
970 //输出a值,输入b值
48 //输出b值
[Process completed - press Enter]
上面是有字符垃圾回收的情况,下面是没有垃圾字符回收的情况
#include<stdio.h>
int main()
{
char a,b;
scanf("%c",&a);
printf("%d",a);
scanf("%c",&b);
printf("%d",b);
return 0;
}
运行结果
a //输入a值
9710 //输出a值,此处未给b赋值,回车(缓冲区内的垃圾字符)填入b,并输出
[Process completed - press Enter]
下面是垃圾字符在循坏语句里的情况
#include <stdio.h>
int main(int argc, char const *argv[])
{while(1)
{ char a;
char b;
scanf("%c",&a);
getchar(); //回收回车(垃圾字符)
printf("%c",a);
}
return 0;
}
总结:
C语言采用缓冲区的机理。输入的字符(包括回车)都会先存入缓冲区,scanf()、getchar()函数,实际上是读取缓冲区内容的命令,如果缓冲区中有内容,就直接读取缓冲区中的内容,只有当缓冲区中没有任何内容,才会要求键盘输入。
个人体会:
当我们有多个顺序输入输出或循环输入输出时,一定不要忘记垃圾字符的存在。关于垃圾字符的回收方法在我的c语言笔记day1里给出了其他方法,大家如果需要,可以去看看。