scanf/getchar/getche/getch()函数要点学习

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值