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))
本博客初衷是自我学习、精进代码,若有不足之处还请多多指正
本文介绍了C语言中的scanf_s函数,特别提到了其在Visual Studio中的安全增强,如自动检查边界。文章通过示例展示了如何限制输入位数、与while循环结合使用、匹配特定字符串、过滤特定字符以及丢弃不需要的字符。同时,还展示了如何综合运用这些技巧读取特定格式的输入。此外,还强调了scanf_s和printf的返回值在判断输入合法性及输出字符计数方面的作用。
2621

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



