关于scanf、sscanf和sscanf_s

C知识扫盲------scanf() 和 scanf_s()与缓冲区 scanf() 和 scanf_s() 是 C 语言中用于从标准输入读取格式化数据的函数。它们通过指定格式说明符,从输入流中读取并解析数据,然后存储在对应的变量中。scanf() 和 scanf_s() 是用于读取标准输入的函数,但在使用时需要特别注意安全性。缓冲区溢出是常见的安全问题,scanf_s() 通过要求指定缓冲区大小来防止这种问题。了解缓冲区的作用和常见错误,以及使用 scanf_s() 等安全函数,可以有效避免程序中的安全漏洞,确保程序的安全性和稳定性。 阅读详情

在使用VS2005编译一个程序时,出现了很多警告,说是用的函数是不安全的,应当使用安全版本,即函数名称增加“_s”的版本。
 
 警告内容:
 warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead.
 
据了解,“_s”版本函数是微软后来对c++做得扩展,用来替代原先不安全的函数,例如:printf、scanf、strcpy、fopen等等。

 

详细参考:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vccrt/html/d9568b08-9514-49cd-b3dc-2454ded195a3.htm

 

原来安全版本的函数,对参数和缓冲边界做了检查,增加了返回值和抛出异常。这样增加了函数的安全性,减少了出错的几率。
同时这也意味着在使用这些函数时,有时你不得不输入更多的关于缓冲区大小的参数,多敲几下键盘能换来更少的麻烦,值得!

 

下面总结了sscanf的以及sscanf_s的常用方法,也体现了“_s”版本函数与原函数的特别之处:

 

1、sscanf和scanf的不同是输入来源,前者是一个字符串,后者则是标准输入设备

 

2、sscanf的使用,以解析时间字符串为例,将字符串“2009-01-02_11:12:13”解析为整型年月日时分秒

 

//定义
 char cc;
 tm tm_temp={0};
 string stime("2009-01-02_11:12:13");

 

//(1) 必须严格按照分隔符形式匹配填写,若遇到不匹配项则终止解析


 sscanf(stime.c_str(), "%4d-%2d-%2d_%2d:%2d:%2d",
  &tm_temp.tm_year,
  &tm_temp.tm_mon,
  &tm_temp.tm_mday,
  &tm_temp.tm_hour,
  &tm_temp.tm_min,
  &tm_temp.tm_sec
  );
  
//(2) 可以不按照分割符号形式填写,字符数必须一致,例如可以正确解析“2009/01/02_11:12:13”


 sscanf(stime.c_str(), "%4d%c%2d%c%2d%c%2d%c%2d%c%2d",
  &tm_temp.tm_year, &cc,
  &tm_temp.tm_mon, &cc,
  &tm_temp.tm_mday, &cc,
  &tm_temp.tm_hour, &cc,
  &tm_temp.tm_min, &cc,
  &tm_temp.tm_sec
  );
 
//(3) 可以不按照分割符号形式填写,字符数必须一致,同上,%1s可以等同于%c


 sscanf(stime.c_str(), "%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d",
  &tm_temp.tm_year, &cc,
  &tm_temp.tm_mon, &cc,
  &tm_temp.tm_mday, &cc,
  &tm_temp.tm_hour, &cc,
  &tm_temp.tm_min, &cc,
  &tm_temp.tm_sec
  );

 

//(4) 可以不按照分割符形式和数量填写,类型必须一致,例如可以正确解析“2009/01/02___11:12:13”
//这里使用了sscanf的正则表达式,与通用的正则表示类似但不完全相同,%*c表示忽略连续多个字符


 sscanf(stime.c_str(), "%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d",
  &tm_temp.tm_year,
  &tm_temp.tm_mon,
  &tm_temp.tm_mday,
  &tm_temp.tm_hour,
  &tm_temp.tm_min,
  &tm_temp.tm_sec
  );
  
3、sscanf_s的使用

 

 //定义
 char cc[2];
 tm tm_temp={0};
 string stime("2009-01-02_11:12:13");

 

//(1) 与sscanf第一种方法相同,可以使用"%4d-%2d-%2d_%2d:%2d:%2d"格式匹配解析


 sscanf_s(stime.c_str(), "%4d-%2d-%2d_%2d:%2d:%2d",
   &tm_temp.tm_year,
   &tm_temp.tm_mon,
   &tm_temp.tm_mday,
   &tm_temp.tm_hour,
   &tm_temp.tm_min,
   &tm_temp.tm_sec
   );
  
//(2) 使用%c格式对数据解析时,必须对相应的缓冲区增加长度参数,否则将会出错


 sscanf_s(stime.c_str(), "%4d%c%2d%c%2d%c%2d%c%2d%c%2d",
  &tm_temp.tm_year, &cc, 1,
  &tm_temp.tm_mon, &cc, 1,
  &tm_temp.tm_mday, &cc, 1,
  &tm_temp.tm_hour, &cc, 1,
  &tm_temp.tm_min, &cc, 1,
  &tm_temp.tm_sec
  );
  
//(3) 使用%s格式对数据解析时,缓冲长度必须大于字符串长度,否则不予解析


 sscanf_s(stime.c_str(), "%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d",
   &tm_temp.tm_year, &cc, 2,
   &tm_temp.tm_mon, &cc, 2,
   &tm_temp.tm_mday, &cc, 2,
   &tm_temp.tm_hour, &cc, 2,
   &tm_temp.tm_min, &cc, 2,
   &tm_temp.tm_sec
   );

 

//(4) 与sscanf一样,sscanf_s同样支持正则表达式


 sscanf_s(stime.c_str(), "%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d",
  &tm_temp.tm_year,
  &tm_temp.tm_mon,
  &tm_temp.tm_mday,
  &tm_temp.tm_hour,
  &tm_temp.tm_min,
  &tm_temp.tm_sec
  );
  
通过以上对比sscanf与sscanf_s的使用,可以看出后者对缓冲区安全有了更多的考虑,从而避免了许多不经意的烦恼。

C/C++字符输入函数(详解) 文章目录C/C++字符输入函数(详解)1.常用函数(scanf函数)2.cin流控输入3. gets()函数4.getline()函数5.cin.get (char *str, int maxnum)特殊输入函数1> sprintf():2> sscanf():上章题解:问题:通过灵活输入原字符串,需要替换的字符换,需要被替换的字符串,并输出结果。 C/C++字符输入函数(详解) C/C++实现从终端(包括但不限于键盘,对于嵌入式设备可以是网口/串口)。 C/C++所提供的标准库提供了不下于一 阅读详情

相关推荐

sscanf,sscanf_s及其相关用法

#include<stdio.h>  定义函数 int sscanf (const char *str,const char * format,........); 函数说明   sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。 返回值 成功则返回参数数目,失败则返回-1,错误原因...

liudongdong_jlu 1万+

2025.06.25【微生物】|Emu工具安装与使用详解:全长16S扩增子微生物丰度分析

Emu是一款基于贝叶斯方法的微生物多样性分析工具,专为处理高错误率的长读长16S/18S扩增子数据优化。本文详细介绍了Emu的安装与使用方法:1)通过conda创建独立环境并安装Emu;2)提供SILVA等预构建数据库的下载指南,并说明自定义数据库的构建方法;3)演示单样本和多样本分析流程,解读关键输出文件;4)介绍丰度表合并、分类等级汇总等实用功能扩展;5)建议后续分析方向。文章还附有官方GitHub链接和相关文献资源,为微生物群落结构研究提供了一套完整的分析解决方案。

1256

C++ 字符串格式化转为 数据变量 - sscanf,sscanf_s及其相关用法

注意sscanf_s,当读入的类型是整数或其它长度可以确定的类型时,不能在类型后面跟上长度,但是对于字符串类型(char *)长度无法得知则必须在类型后面明确指出字符串的最大长度(即可以容纳的空间)。在使用VS2005编译一个程序时,出现了很多警告,说是用的函数是不安全的,应当使用安全版本,即函数名称增加“_s”的版本。通过以上对比sscanf与sscanf_s的使用,可以看出后者对缓冲区安全有了更多的考虑,从而避免了许多不经意的烦恼。原来安全版本的函数,对参数和缓冲边界做了检查,增加了返回值和抛出异常。

wmy19890322的专栏 4033

linux下wayland协议修改键盘映射

linux下wayland协议,修改键盘映射,实验环境是Ubuntu24,其他wayland协议窗口应该也是可以的。

qq_15027967的博客 1068

西工大noj100题python2024第三季21-30

【代码】西工大noj100题python2024第三季21-30。

weixin_70523540的博客 1578

初识sscanf_s

本人用rapidxml写一个学生信息操作的时候遇到了一个问题:一个由多个原子信息构成的属性值字符串如何取出其中单个的某个原子信息。xml文件内容如下: <?xml version="1.0" encoding="gb2312"?> <StudentInformation> <StudentList> <Student>张三 男 1001 13440069817</Student> <Student&gt...

arible的博客 5210

DC综合中set_dft_signal的实战配置与优化策略

本文深入解析了DC综合中set_dft_signal命令的实战配置与优化策略。文章从命令的核心作用出发,详细拆解了-view、-type、-usage等关键参数,并通过扫描使能与时钟门控的实战案例,展示了如何正确配置以实现测试模式下的功耗优化。同时,文章总结了高级优化策略、与低功耗流程的协同方法以及常见错误排查清单,旨在帮助数字芯片设计工程师构建高可测性、低功耗的稳健DFT基础。

weixin_28347369的博客 403

sscanf函数用法详解

以前一直以为sscanf只能用来简单的提取用空格隔起来的字符串,知道之前遇到了一些列字符串处理问题,详细研究起来这个函数尽然还是有很强大的有很多类似于正则表达式的功能。首先我们先来看函数定义: 定义函数 int sscanf (const char *str,const char * format,........); 函数说明 ...

liangtianmeng的专栏 7078

微电网系列: 位移因数DPF&&功率因数PF&&过激&&欠激

文中对比了位移因数(DPF,仅基波相位)与功率因数(PF,含谐波影响)的差异,指出PF=DPF×DF(畸变因数)。过激/欠激状态对应无功功率控制:过激(容性,电流超前,抬升电压)与欠激(感性,电流滞后,抑制电压)。PCS(如光伏逆变器)需逆向调节电网无功状态,过激时发出容性无功,欠激时吸收感性无功,以维持电压。

云纳星辰怀自在 1174

【异常】解决 Claude Code 及第三方插件提示 “API Error: 404“ 的配置修复指南

在使用 Claude 相关的 CLI 工具(如)或 IDE 插件进行开发辅助时,配置错误的模型参数是导致连接失败的常见原因。本文将针对这一典型报错进行复盘与解决。

奶爸的编程之路,也就一周冷个三天 7747

scanf、sscanf和sscanf_s

http://blog.youkuaiyun.com/shellching/article/details/4958518 在使用VS2005编译一个程序时,出现了很多警告,说是用的函数是不安全的,应当使用安全版本,即函数名称增加“_s”的版本。    警告内容:  warning C4996: 'sscanf': This function or variable may be unsafe. Co

muzi20102010的专栏 866

【机器学习-09】特征工程

特征工程是机器学习模型构建的初步工作,但它的重要性却贯穿整个模型生命周期。在进行特征工程时,我们需要充分利用数据科学的知识和技巧,结合具体的应用场景和业务需求,来制定出最合适的特征提取和转换策略。只有这样,我们才能为机器学习模型提供最有价值的输入,从而使其发挥出最大的潜力。总之,特征工程是机器学习中的一项关键任务,它需要我们用心去探索、去实践、去创新。只有不断地优化和完善特征工程的过程,我们才能构建出更加准确、更加可靠的机器学习模型,为实际应用带来更大的价值。

qq_38614074的博客 2万+

输出sprintf snprintf sprintf_s和输入scanf sscanf函数使用详解

输出函数sprintf snprintf sprintf_s和输入函数scanf sscanf函数使用详解

qq_20853741的博客 9211

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[转载]关于scanf、sscanf和sscanf_s

原文作者:UU_Yang 来源:优快云 原文:https://blog.youkuaiyun.com/shellching/article/details/4958518 版权声明:本文为博主原创文章,转载请附上博文链接! 在使用VS2005编译一个程序时,出现了很多警告,说是用的函数是不安全的,应当使用安全版本,即函数名称增加“_s”的版本。 警告内容: warning C4996: ‘sscanf’: ...

hb_cqy1的博客 391

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

sscanf取固定长度的int_sscanf字符串提取

functionsscanfint sscanf ( const char * s, const char * format, ...);Read formatted data from stringReads data from s and stores them according to parameter format into the locations given by the addi...

weixin_39599046的博客 707

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

错误 C4996 ‘scanf‘: This function or variable may be unsafe. Consider using scanf_s instead. To disabl

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 解决方案: 1.scanf改为scanf_s,按VS的规定来。 2.代码最上面增加一行: define _CRT_S

成功的方式只有一个,按自己的方式,度过人生。欢迎共赴知识与乐趣的探索之旅! 1302

Errno_t is undefined 报错 M2

解决ernno_t报错的问题

weixin_64753637的博客 360

C08-分支语句Switch

文章目录关于scanf与scanf_s为什么scanf不安全scanf_ssscanfif语句C语言中的表达式switch课堂娱乐 关于scanf与scanf_s 为什么scanf不安全 int main() { char * pszPassWord = "123456"; char arry[10] = {}; int nCount = 0; scanf("%s", arry); ...

Wuli_jiejie的博客 402

C语言scanf返回值怎么写,C语言scanf()返回值

例如scanf(“%d%d”,&a,&b)如果a和b都获得正确的值,则返回2如果a得到一个值,b没有得到一个值c语言fscanf返回-1,则返回1(返回成功接收的分配数)如果遇到错误或文件结尾,则返回值为EOF关于scanf_s,使用VS时会出现scanf_s使用VS时,'scanf': 此函数或变量可能不安全. 考虑使用scanf_s ins. 这是新版本的vc库添加的警告原因.Sscanf使用...

weixin_42303522的博客 739

C语言输入函数深度解析:scanf()与scanf_s()的安全实践指南

本文深入解析C语言中的scanf()与scanf_s()函数,重点讨论缓冲区溢出等安全问题。通过实际案例和代码示例,详细比较两种函数的优缺点,并提供安全输入的最佳实践,帮助开发者避免常见陷阱,确保程序安全稳定运行。

weixin_29018335的博客 213

C语言scanf安全编程:从屏蔽警告到健壮输入处理

在C语言编程中,缓冲区溢出是常见的安全漏洞,常因未对输入进行边界检查导致。其原理在于程序向固定大小的缓冲区写入超出其容量的数据,从而覆盖相邻内存区域,可能引发程序崩溃或被恶意利用。理解这一底层机制对于编写安全可靠的软件至关重要。现代编译器如MSVC会针对存在此类风险的函数(如scanf)发出警告,推动开发者采用更安全的实践。从工程角度看,正确处理输入验证不仅能提升程序稳定性,也是构建健壮系统的基础。本文围绕scanf函数的安全使用,深入探讨了如何通过检查返回值、限制字段宽度以及结合fgets与sscanf等

weixin_33404102的博客 298

C语言printf和scanf函数详解与安全实践

格式化输入输出是C语言编程的核心基础,printf和scanf函数通过格式字符串实现数据的精确控制。printf利用占位符系统实现变量值的动态插入,支持宽度、对齐和精度控制,常用于调试输出和格式化显示。scanf则负责从标准输入解析数据,但需特别注意缓冲区管理和类型匹配以避免安全漏洞。在底层开发中,十六进制输出和指针地址打印是调试利器,而字符串截断和动态宽度设置则提升了工程灵活性。实际开发应遵循输入验证、缓冲区溢出防护等安全编程实践,同时考虑使用fgets等更安全的替代方案。掌握这些基础函数的原理和高级技巧

weixin_30086969的博客 191

sscanf函数的高级用法

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。 函数原型: int scanf( const char *format [,argument]... );其中的format可以是一个或多个: {%[*] [width] [{h|l|I64|L}] type|'_'|'\t'|'\n'|非%符号}, 注:{a|b|c}表示a,...

weixin_30640291的博客 91

_stscanf_s

标准c语言里有scanf和sscanf,它们只是输入源不同而已,前者是标准输入源stdin,后者是字符串作为输入源; _stscanf_s与其类似,后缀【_s】表示它更安全(security);其中【t】(type)表示它同时兼容宽字符; PTSTR deviceId = "PCI\VEN_8086&DEV_3B3C&SUBSYS_04401028&REV_06\3&11583659&0&D0

山不在高,有金则名 9508
上一篇: 思绪琐记
下一篇: 读书笔记
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值