函数名: scanf
功 能: 执行格式化输入
用 法: int scanf(char *format[,argument,…]);
scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
函数名:getchar
功能:从计算机终端(一般是键盘)输入一个字符。
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾(End-Of-File)则返回-1(EOF),且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符
,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。
直接上测试代码:
#include <stdio.h>
int main(void)
{
char chA,chB;
int a,b;
int i = 0;
while (i < 3) {
scanf("%c%3d%c%2d",&chA,&a,&chB,&b);
//getchar();//此处重点,加上getchar程序运行正确!
printf("+b:%d\n",b);
b += a;
printf("cha:%c...chb:%c\n",chA,chB);
printf("a:%d\n",a);
printf("b:%d\n",b);
i++;
}
return 0;
}
运行结果如下:
红色标记为输入字符,其他为打印出来的
分析:
首次输入:H123i45 运行打印正确
但是第二次输入H123i45
变量cha存入的是:回车
变量b存入的是:168为上次运算的值
说明:第一次执行的结果遗留下回车字符 被scanf读取到,因其以Space、Enter、Tab结束一次输入,所以,在变量cha为回车后,其后续变量不在读取直接跳过(未被第二次输入改变的变量:a=123、chb=‘i’、b=168)
所以第二次加法运算其b值为291=168+123