C语言scanf()解析

从键盘到内存

在这里插入图片描述
键盘输入“a b c abc回车”
会将键盘输入内容缓存至键盘缓存区,等待程序中scanf() 读取

a空格b空格c空格abc回车

scanf原型

int scanf(const char * restrict format,...);

返回值为成功读取数据个数
例:

#include<stdio.h>
int main()
{
	int a,b,c;
	printf("%d",scanf("%d %d %d",&a,&b,&c));
}	

运行环境:win7、 Dev-C++ 5.11

在用“%c”格式输入字符时,空白字符(space,tab,newline)和“转义字符”都作为有效字符输入。

输入:12 w d 回车
运行结果:
在这里插入图片描述

scanf中参数中 不属于格式指令的字符 的作用

空白字符

空白字符会使scanf函数在读操作中略去输入中的一个或多个空白字符;
常见使用scanf()赋多值时使用
例(程序读取时没有跳过空白字符):

#include<stdio.h>
int main()
{
	char a,b,c;
	static int num;
	
	scanf("%c%c%c",&a,&b,&c);
	printf("读取到的字符为:%c,%c,%c;",a,b,c);
}

输入“a b c回车”
在这里插入图片描述
例(程序读取时使用空白字符做分割):

#include<stdio.h>
int main()
{
	char a,b,c;
	static int num;
	
	scanf("%c %c %c",&a,&b,&c);
	printf("读取到的字符为:%c,%c,%c;",a,b,c);
}

输入:“a b c回车”
a,b之间一个空格,b,c之间两个空格

在这里插入图片描述
输入“ a b c回车”:
a前面有空格
在这里插入图片描述
第一个读取到的字符为"空格",读取到的“空格”后面没有跟其他空格,所以不需要剔除空格,之间开始第二个字符“a”的读取,第二个字符后面跟着空格,剔除空格后继续读取第三个字符"d"。
可参考 非空白字符在格式说明符后面 部分

非空白字符

一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。

非空白字符在格式说明符后面

读取到一个字符时,检测后面是否有参数中的非空白字符,如果有,则剔除掉该字符(只能剔除一次该字符,不能像空白字符一样可以剔除发多次)。 ``` #include

输入:“atbtct回车”
输出:
在这里插入图片描述

输入:“ttttttt回车” //输入7个t
输出:
在这里插入图片描述

ttttttt回车
读取删除读取删除读取删除读取回车

非空白字符在格式说明符前面

读取字符时得先检测到非空白字符才会读取字符(以 t 为例)。

#include<stdio.h>
int main()
{
	char ch;
	char chs[100];
	static int num;
	while(scanf("t%c",&ch))//此处读取
	{
		num++;
		printf("%c\t",ch);
		printf("%d\n",num);
	}
	scanf("%s",&chs);
	printf("剩余在键盘缓冲区的未被读取的字符为:\n");
	printf("%s\n",chs);
} 

输入:“abcdefg回车”
输出:
在这里插入图片描述
输入:“tatbcdef回车”
输出:
在这里插入图片描述

补充:

在用“%c”格式输入字符时,空白字符和“转义字符”都作为有效字符输入。
在用“%s”格式输入字符时,输入的字符串中含有空白字符,字符串读取结束。

参考网址:

关于C/C++ stdin缓冲区以及对字符输入的一些经验和心得
https://blog.csdn.net/ShannonNansen/article/details/76090172
百度百科:scanf()
https://baike.baidu.com/item/scanf/10773316?fr=aladdin
scanf函数详解与缓冲区
https://blog.csdn.net/c_base_jin/article/details/24135463

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值