scanf系列的边界检查函数(scanf_s/fscanf_s/sscanf_s)

admin 2025-11-16 阅读:34 评论:0
萌新的学习笔记,写错了恳请斧正。 目录 scanf/fscanf/sscanf #include int scanf( const char* format, ... ); int fscanf( FILE* stream, const...

萌新的学习笔记,写错了恳请斧正。

目录

scanf/fscanf/sscanf

#include 
int scanf( const char* format, ... );
int fscanf( FILE* stream, const char* format, ... );
int sscanf( const char* buffer, const char* format, ... );

这三个函数从各种资源读取数据,按照格式控制字符串(format)转译,并将结果存储到指定位置

这三个函数返回成功赋值的接受参数的数量(可以为零),出错则返回EOF。

他们的区别在于:

scanf和fscanf已经具体的讲过了

sscanf的特性与fscanf等同,抵达字符串尾('\0')等价于fscanf抵达文件尾的条件

sscanf使用实例

#include 
#include 
int main()
{
	int a = 0;
	char* arr = (int*)malloc(100 * sizeof(int));
	char str[100] = { 0 };
	sscanf(" 114514 afjoiweaj jiojl", "%d%s%s", &a, arr, str);
	printf("%d - %s - %s", a, arr, str);
	return 0;
}

printf/fprintf/sprintf/snprintf

#include 
int printf( const char* format, ... );
int fprintf( FILE* stream, const char* format, ... );
int sprintf( char* buffer, const char* format, ... );
int snprintf( char* buffer, int bufsz, const char* format, ... );

前三个函数从给定位置加载数据,按一定要求转换为字符串等价物,并写结果到各种地方

第四个函数snprintf就是增加了长度限制的sprintf,其他没有区别

对比四个函数:

sprintf使用实例

#include 
int main()
{
	char a[10] = "1919810";
	sprintf(a, "%s", "114514");
	printf(a);
	return 0;
}

snprintf使用实例

#include 
int main()
{
	char str[100];
	snprintf(str, 100, "Hello %s", "World!");
	printf(str);
	return 0;
}

scanf系列的边界检查函数(scanf_s/fscanf_s/sscanf_s)

首先声明一点whatsapp登录,这些为了安全创造的带有下划线s结尾的边界检查函数是在C11标准中定义的可选函数,所以并不是每一个编译器都能编译这个函数,只有在使用的编译器实现定义“__STDC_LIB_EXT1__”而且在包含前定义“__STDC_WANT_LIB_EXT1__”为整数常量1时才能保证这些函数一定可以使用。当然,不少编译器都默认开启了这些函数,比如在Visual Studio中这些函数就是默认开启的,甚至如果使用不安全的不带边界检查的这些函数还会警告并中断编译(在文件前定义“_CRT_SECURE_NO_WARNINGS”为整数常量1可以忽略不安全函数警告)

//就是加上这一行以禁用不安全函数警告
#define _CRT_SECURE_NO_WARNINGS 1
//后面的1可以省略,默认定义值为1

这些函数相比于传统函数,多了边界检查,可以防止缓冲区溢出

#include 
int scanf_s(const char* format, ...);
int fscanf_s(FILE* stream, const char* format, ...);
int sscanf_s(const char* buffer, const char* format, ...);

机制与传统函数相同telegram中文版,除了:

1. 如果在格式限定中使用了%c 、 %s 或 %

,后面可变参数列表中与其对应的参数变成两个,第一个仍为传统函数的参数,第二个则是类型为rsize_t的一个值,用于限定这个格式匹配符最多能匹配多少个字节的内容。比方说:

#include 
int main()
{
	int n = 0, m = 0;
	char arr[10] = { 0 };
	scanf_s("%d%x%s", &n, &m, arr, (rsize_t)sizeof arr);
	printf("n=%d m=%d arr=%s\n", n, m, arr);
	return 0;
}

这段代码中whatsapp官网,scanf_s中%s对应的参数包括arr和(rsize_t)sizeof arr两个arr是读取后保存的位置,后面则是限定最多读取10个字节(空终止符'\0'是算在内的,所以实际最多读9个)

2. 在运行时额外检测以下违规行为,如果出现违规也返回EOF:

printf系列的边界检查函数(printf_s/fprintf_s/sprintf_s/snprintf_s)

其使用条件与优越性与scanf系列的边界检查函数相同

#include 
int printf_s(const char* format, ...);
int fprintf_s(FILE* stream, const char* format, ...);
int sprintf_s(char* buffer, rsize_t bufsz, const char* format, ...);
int snprintf_s(char* buffer, rsize_t bufsz, const char* format, ...);

其机制与传统函数相同,除了在运行时检测如下违规行为:

关于返回值:

利用snprintf决定包含输出的缓冲区大小

当我们不确定输出字符串的大小时,我们可以利用以零为bufsz和以空指针为buffer的snprintf来决定缓冲区大小。为什么呢?

当bufsz为零、buffer为空指针时,根据上面的介绍,我们知道这只会输出忽略bufsz限制情况下本应写入的字符数,而且不会产生其他影响。而这个输出值,不就是我们需要的缓冲区大小值吗?

下面是一个例子:

#include 
#include 
#include 
int main()
{
	const char* format = "sqrt(2) = %f";
	int sz = snprintf(NULL, 0, format, sqrt(2));
	char* buf = (char*)malloc(sz + 1);	// +1 for '\0'
	snprintf(buf, sz + 1, format, sqrt(2));
	printf("%s\n", buf);
	return 0;
}

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

热门文章
  • 详细指南:WhatsApp国内使用方法全攻略-下载安装、注册登录及功能使用攻略

    详细指南:WhatsApp国内使用方法全攻略-下载安装、注册登录及功能使用攻略
    一、下载与安装WhatsApp WhatsApp是一款全球使用范围极广的即时通讯软件,不仅可以实现文本聊天,还能进行语音、视频通话WhatsApp中文版,发送文件等功能。由于众所周知的原因,国内用户想要下载和安装WhatsApp可能会遇到一些困难。不过,只要按照以下步骤操作,就能顺利完成WhatsApp的下载和安装。 首先,我们需要解决的是下载问题。由于WhatsApp在国内的应用商店无法直接下载,所以我们需要寻找其他的下载途径。Android用户可以选择到各大安卓市场搜索下...
  • 苹果IOS5.1.1机完美越狱

    苹果IOS5.1.1机完美越狱
    越狱工具下载:(需手动复制: http://bbs./read-htm-tid-4804612.html ) 详细的越狱教程: Absinthe 2.0.4的越狱方法与Absinthe 1.0的越狱方法完全一样,非常简单的“傻瓜一键式”。不过这里绿毒有说明,最好重新刷固件。支持越狱设备IOS5.1.1的固件下载地址请点击本站的IOS固件下载,看下图: 下载完固件之后,把设备连接iTunes,开始刷固件。你也可以选择不刷,但是在越狱的过程之中,新的系统在越狱时会比较的顺利,...
  • 电脑微信的聊天照片文件在哪里微信图片保存电脑哪个文件夹

    电脑微信的聊天照片文件在哪里微信图片保存电脑哪个文件夹
    1. 怎么找到微信聊天图片在哪个文件夹里 图片保存路径:/storage/emulated/tencent/MicroMsg/WeiXin/文件夹,这个是完整路径。而在文件夹中只需要找到/tencent/MicroMsg/WeiXinWhatsApp中文版,就可以了,前面两个文件夹是系统根目录。以下是保存及查找图片的方法步骤介绍。 第一步、找到桌面的微信APP,直接点击打开这个微信的APP。 2. 电脑微信图片保存在哪个文件夹 个人微信文件夹。 电脑版微信聊天的图片,都保存到...
  • Windows 11版WhatsApp将从UWP/Native切换回WebView2打包模式

    Windows 11版WhatsApp将从UWP/Native切换回WebView2打包模式
    Meta(最近更名为 Meta AI)悄然宣布,WhatsApp 将在 Windows 11 上放弃 UWP(WinUI)WhatsApp中文版,退回采用基于 Chromium 的容器。这意味着 WhatsApp 又回到了几年前的样子。由于 web.whatsapp.com 一直领先于 Windows 应用开发,它确实拥有一些新功能,但速度更慢,占用更多内存。 如果独立开发者因为无力维护所有平台的代码库而选择 Web 应用程序,那是一回事,但当像 Meta 这样价值万亿美元...
  • 小米下載WhatsApp的完整指南:安装与使用注意事项

    小米下載WhatsApp的完整指南:安装与使用注意事项
    综上所述,确保您的小米手机具备以上条件,将有助于您顺利下载和安装WhatsApp,享受便捷的通讯服务。在满足这些条件后,您就可以按照后续步骤进行WhatsApp的下载和安装。 2. 下载和安装WhatsApp的具体步骤 在小米手机上下载和安装WhatsApp的具体步骤相对简单,但需注意一些特殊情况。首先,确保你的手机系统已更新到最新版本,以保证最佳的兼容性。由于安卓手机商店内无法直接找到WhatsApp,你可以通过APKPure等第三方应用商店进行下载。打开APKPure应用...