scanf/getchar/getche/getch()函数要点学习
1.scanf()
这个函数和getchar类似,首先从stdin缓冲区读取字符,如果缓冲区有符合格式要求的数据,及获取数据,返回给程序,指针指向下一个数据,函数结束;
如果缓冲区没有符合要求的数据(这里不一定为空,因为有时候缓冲区不为空,但是没有符合格式的数据,例如:缓冲区存在”空格“或者”回车“,但是返回类型为整形参数),则等待从键盘输入数据,并且必须以回车键结束,输入的数据存入stdin缓冲区,(至少输入一个满足格式要求的数据才可以以回车键结束输入,否则按回车键,继续等待输入)然后scnaf()从缓冲区获取一个数据并返回,函数结束。
重点说明
在 scanf 中,从键盘输入的一切数据,不管是数字、字母,还是空格、回车、Tab 等字符,都会被当作数据存入缓冲区。存储的顺序是先输入的排前面,后输入的依次往后排。按回车键的时候 scanf 开始进入缓冲区取数据,从前往后依次取。
但 scanf 中 %d 只识别“十进制整数”。对 %d 而言,空格、回车、Tab 键都是区分数据与数据的分隔符。当 scanf 进入缓冲区中取数据的时候,如果 %d 遇到空格、回车、Tab 键,那么它并不取用,而是跳过继续往后取后面的数据,直到取到“十进制整数”为止。对于被跳过和取出的数据,系统会将它从缓冲区中释放掉。未被跳过或取出的数据,系统会将它一直放在缓冲区中,直到下一个 scanf 来获取。
但是如果 %d 遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出。
例子说明
使用scanf 输入两种类型的变量,分别为 char 和int型,代码如下:
int main()
{
char chara, charb, charc;//输入字符
printf("代码段1----------------\n");
printf("input 字符a:\n");
scanf("%c", &chara);
//getchar();
printf("input 字符b:\n");
scanf("%c", &charb);
printf("input 字符c:\n");
scanf("%c", &charc);
printf("字符a=%c,字符b=%c,字符c=%c\n", chara, charb,charc);
printf("代码段2---------------\n");
int a , b,c; //输入数字
printf("输入整数a=");
scanf("%d", &a);
//getchar();
printf("输入整数b=");
scanf("%d", &b);
printf("输入整数c=");
scanf("%d", &c);
printf("a=%d, b=%d, c=%d\n", a, b,c);
system("pause");
return 0;
}
两段代码编译后,根据提示 在控制台内 分别输入 a回车C 和 1回车3回车10回车。
结果如下

代码1 执行过程说明
我们发现当 提示input 字符a:时,我们输入a回车。程序在input 字符b:并没有等待用户输入,而是直接跳到input 字符c:,然后我们输入c回车。
最终打印时,我们发现 字符b=回车。
这是怎么回事呢?
因为
- 第一次读取赋值给chara。
scanf函数从缓冲区获取字符a存入a变量,然后执行printf(“input 字符b:\n”);和scanf("%c", &charb);,因为此时缓冲区有一个回车键,
- 第二次读取赋值给charb。
scanf()函数获取回车键存入变量b,所以这里不需要等待用户输入直接进入printf(“input 字符c:\n”);打印,之后scanf("%c", &charc);
- 第三次读取赋值给charc。
发现缓冲区没有数据,就需要用户输入,这里输入”b“存入变量c,然后依次打印变量a、b、c可以看出先输出”a“啊,然后换行,在输出”b“。

代码2 执行过程说明
当执行18行时scanf("%d", &a);读取缓存区,此时缓冲区内是上次输入的回车,但是由于此时需要返回的为int型,因此会跳过回车,所以程序会等待用户输入一个有效的数据,输入数字1回车,所以最终a=1。 后面的b和c同理,最终得到b=3,c=10。

2.getchar()
**char a;
a=getchar();
就是我们从键盘输入的一个字符。**
getchar() 函数的特点是:如果缓冲区中没有内容,那么等待用户输入;如果有内容,哪怕一个字符,也会直接从缓冲区中读取数据,不会等待用户输入。
第一次调用 getchar() 时,会等待用户输入,用户输入的所有字符都被放到标准输入(stdin)缓冲区,直到用户按下回车键为止(回车符也被放入缓冲区)。用户按下回车键,getchar() 函数才开始从缓冲区中读取数据,每次读取一个字符。
ch = getchar();与scanf(“%c”,&ch);有同样的效果
与scanf()不同的是,getchar()没有参数,它返回来自输入设备的下一个字符,getchar()不需要格式说明符,因为它只对字符(ASCII码表中的字符)起作用,并且一次只能读取来自stdin标准输入流的一个字符。如果我们想要读取多个字符可以使用while或者for语句。
如while((ch = getchar())!= ‘\n’);
例子
int main()
{
char ch;
while ((ch = getchar()) != '\n')
//从输入流按顺序接着取出字符,每次读取一个字符,一直血环知道遇到回车/换行符则结束
{
printf("%c ", ch);//每次打印一个字符
}
return 0;
}
效果如图

3.getch()
在介绍getch()之前首先我们记住,要用getch()必须引入头文件“conio.h”,并且此函数非标准库函数。
getch()直接从键盘获取数据,不等待用户按回车,只要用户按一个键,getch就立刻返回并且输入结果不回显。
getch 和 getchar 的作用类似,都是从键盘读取一个字符,但是:
getch 不带回显,也就是说,你输入的字符不会在屏幕上显示出来。
getch 没有缓冲区,也就是说,输入一个字符就立即读取。
使用 getch 的好处是,不管你按什么键,都不会在屏幕上留下痕迹,使你的界面达到美观效果
#include <stdio.h>
#include <conio.h>
int main(){
char c1, c2;
c1 = getch();
printf("%c\n", c1);
c2 = getch();
printf("%c\n", c2);
return 0;
}
先输入 ‘a’,再输入 ‘b’,运行结果为:
a
b
输入一个字符,getch 会立即获取,不会给你多输入一个字符的机会。并且输入的字符只由 printf 语句显示一次,getch 不会显示。
4.getche()
getche()函数
getche()和getch()很相似,也没有缓冲区,区别在于:getch()无回显,getche()有回显。
#include <stdio.h>
#include <conio.h>
int main(){
char c1, c2;
c1 = getche();
printf("%c\n", c1);
c2 = getche();
printf("%c\n", c2);
return 0;
}
先输入 ‘a’,再输入 ‘b’,运行结果为:
aa
bb
3761

被折叠的 条评论
为什么被折叠?



