C语言——Scanf()的实用、高级用法

本文介绍了C语言中的scanf_s函数,特别提到了其在Visual Studio中的安全增强,如自动检查边界。文章通过示例展示了如何限制输入位数、与while循环结合使用、匹配特定字符串、过滤特定字符以及丢弃不需要的字符。同时,还展示了如何综合运用这些技巧读取特定格式的输入。此外,还强调了scanf_s和printf的返回值在判断输入合法性及输出字符计数方面的作用。

scanf的基础用法就不用介绍了,值得一提的是用VS会有一个scanf_s函数,

#include<stdio.h>
//以下是Senky的代码
int main()
{
	int num = 0;
	scanf_s("%d", &num, sizeof(num));
	 return 0;//编辑于2022/09/16
	}

第三个参数是值将缓冲区读入多少个字节,因为传统的scanf是不会检查越界的,这样的函数更加的安全(在VS2022中,第三个参数是不用自己传入的,编译器会自动检查)

下面来看看Scanf()的一些很好用的特殊用法:

一、和while()的奇妙配合

先来看看基础用法:

控制读入的位数

#include<stdio.h>
//以下是Senky的代码
int main()
{
	char a[10];
	char* num=a;
	scanf_s("%5s", num, sizeof(num));
	printf("%s", a);
	 return 0;//编辑于2022/09/16
	}
限制位数

那么和while配合:

#include<stdio.h>
//以下是Senky的代码
int main()
{
	char str[100];
	while (~scanf_s("%5s", str, sizeof(str)))
	{
		printf("%s\n", str);
	}
	return 0;//编辑于2022/09/16
}
结果

能够循环读入5个字符 ,直到缓冲区为空,余位用空格填补

(一)scanf、printf是有返回值的:

1) 正整数,表示正确输入参数的个数。
2) 0,表示用户的输入不匹配,无法正确输入任何值,返回0。
3) EOF,这是在 <stdio.h >里面定义的常量(通常值为-1),表示输入流已经结束。

因此scanf能够写在while里面判断输入是否合法

printf()也是有返回值:

#include<stdio.h>
//以下是Senky的代码
int main()
{
	int a = 5;
	if (a == printf("1234\n"))
	{
		printf("printf函数返回值是输出的字符个数(包括\\n)");
	}
	return 0;//编辑于2022/09/16
}

二、匹配特定的字符串 

scanf匹配特定字符串的格式:%[特定字符串]

#include<stdio.h>
//以下是Senky的代码
int main()
{
	int a[100];
	scanf("%[senky]", a);
	printf("%s", a);
	return 0;//编辑于2022/09/16
}

遇到第一个不匹配的字符串元素就会结束 

[ ]内无空格
[ ]内有空格

 三、过滤特定的字符串

scanf过滤特定字符串的格式:%[^特定字符串](加了个^符号)

#include<stdio.h>
//以下是Senky的代码
int main()
{
	int a[100];
	char* p = a;
	scanf("%[^a-zA-Z]", p);
	printf("%s", p);
	return 0;//编辑于2022/09/16
}

只读入大小写字母以外的字符

 因此scanf("%[^\n]")可以代替gets( )TA们都是读取一行

四、丢弃过滤的字符

既然能够过滤字符,那么过滤的字符我们肯定是不想要的,那么如何丢弃呢:

scanf()允许把读取到的数据直接丢弃,不往变量中存放,具体方法就是在%后面加一个 * 号

#include<stdio.h>
//以下是Senky的代码
int main()
{
	char a[20]="Senky";//初始化
	char* p = a;//指针指向数组a
	scanf("%*[^ a-zA-Z]");
	printf("此时还未输入字符串的a[20]:%s\n", p);
	scanf("%[ a-zA-Z]", a);
	printf("丢弃过滤字符后    的a[20]:%s\n", p);
	return 0;//编辑于2022/09/16
}

第十行以后才将缓冲区的值写入a(注意看左下角的变量监视):

五 、综合应用

输入一长串字符串,一次读入8个字符并且只将大小写字母、空格输出:

#include<stdio.h>
//以下是Senky的代码
int main()
{
	int i = 0;
	char str[80]="Senky";//初始化
	scanf("%*[^ a-zA-Z]");
	while (scanf("%8[ a-zA-Z]", str), str[i++])
	 {
		//循环读入8位只含有空格、大小写字母的字符并输出
		printf("%s\n", str);
		scanf("%*[^ a-zA-Z]");
	 }
	return 0;//编辑于2022/09/16
}

 这句while(scanf)就是来控制循环输入输出的语句,一次读入8个字符(空格、大小写字母)

while (scanf("%8[ a-zA-Z]", str))

 本博客初衷是自我学习、精进代码,若有不足之处还请多多指正

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值