sprintf和sprintf_s区别_scanf this function or variable

sprintf和sprintf_s区别_scanf this function or variable输出sprintf snprintf sprintf_s和输入scanf sscanf函数使用详解一、sprintf snprintf sprintf_s函数使用众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf.自从snprint

输出sprintf snprintf sprintf_s和输入scanf sscanf函数使用详解   一、sprintf snprintf sprintf_s函数使用   众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf.自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少。   linux和windows下是不同的。linux下用的是snprintf();而windows下用的是_snprintf();   1、sprintf()   sprintf指的是字符串格式化命令.   sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已, 前者打印到字符串中, 后者则直接在命令行上输出。   1、sprintf()把整数打印到字符串中   如:   sprintf(s, “%d”, 123); //把整数123打印成一个字符串保存在s中   sprintf(s, “%8x”, 4567); //小写16进制,宽度占8个位置,右对齐   2、打印16 进制内容时,通常想要一种左边补0 的等宽格式   sprintf(s, “%08X”, 4567); //产生:“000011D7”   很简单,在表示宽度的数字前面加个0 就可以了。   3、控制浮点数打印格式   浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符”%f”控制,默认保留小数点后6 位数字,比如:   sprintf(s, “%f”, 3.); //产生”3.”   4、控制打印的宽度和小数位数   ”%m.nf”格式,其中m 表示打印的宽度,n 表示小数点后的位数。比如:   C语言对数组进行操作时并不检测数组的长度,如果str的长度不够,sprintf()很容易造成缓冲区溢出,带来意想不到的后果,黑客经常利用这个弱点攻击看上去安全的系统:   运行结果为:”The length of the string is more than 10“,   同时系统提示程序已经停止。原因就是要写入的字符串的长度超过了buf的长度,造成缓冲区溢出。   使用snprintf()来代替sprintf()将能够很好的解决这个问题。   2、snprintf()   snprintf()函数用于将格式化的数据写入字符串   原型为: int snprintf(char *str, int n, char * format [, argument, …]);   参数: str为要写入的字符串;n为要写入的字符的最大数目,超过n会被截断;format为格式化字符串,与printf()函数相同;argument为变量。   返回值: 成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。   snprintf()比sprintf()多了一个参数,能够控制要写入的字符串的长度,更加安全,只要稍加留意,不会造成缓冲区的溢出。   输出结果   string:   abcde   character count = 10   对于返回值,需要注意的是snprintf的返回值是欲写入的字符串(即源字符串)长度,而不是实际写入的字符串度。如:   输出的结果为:   10|1234   3、sprintf_s   int sprintf_s(char *restrict buffer, rsize_t bufsz,   const char *restrict format, …);   将数据格式化输出到字符串,sprintf_s()是sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险。   sprintf_s原先只有windows的编译器才只支持,并不是C中的标准函数。   C11标准中加入了对该函数的支持,但是是可选的,并非强制加入。   C11中规定,如果编译器实现了__STDC_LIB_EXT1__ 宏,那么就要支持对该函数的实现。   gcc编译器只是部分的支持C11标准,本人测试在ubuntu的gcc 5.4.0版本中也没有实现__STDC_LIB_EXT1__ 。   gcc中可以用snprintf函数简单替代sprintf_s,但是注意2者在实现上是有一定的区别,不是完全相同。   int snprintf( char *restrict buffer, int bufsz,   const char *restrict format, … );   二、scanf sscanf函数使用   1、 scanf()   scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。   scanf函数的一般形式为:scanf(“格式控制字符串”, 地址表列);   scanf(“%d”,&a);   &是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。   表示输入数据的类型,其格式符和意义如下   %d: 输入十进制整数   %o: 输入八进制整数   %x: 输入十六进制整数   f1a; 输入无符号十进制整数   %f或e: 输入实型数(用小数形式或指数形式)   %c: 输入单个字符   %s: 输入字符串   scanf(“%d %*d %d”,&a,&b);   用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。   当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。   scanf(“%d%d”,&r,&c);   将接受输入 10 20,但遇到 10,20 则失败。   2、 sscanf()   sscanf()的作用: 从一个字符串中读进与指定格式相符的数据.   定义函数 int sscanf (const char *str,const char * format,…);函数说明:   sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。   一、描述   sscanf通常被用来解析并转换字符串,其格式定义灵活多变,可以实现很强大的字符串解析功能。   sscanf的原型   #include <stdio.h>   int sscanf(const char *str, const char *format, …);   str:待解析的字符串;   format:字符串格式描述;   其后是一序列数目不定的指针参数,存储解析后的数据.   二、示例用法   1. sscanf的基本用法   整形数转换   输出结果:   converted=3, year=2019, month=11, day=03   ”%04d%02d%02d”是用来解析字符串的格式,%表示格式转换的开始,d表示转换为一个整数,04作为d的修饰,表示这是一个长度为4位的整数,不足4位时以0补齐。   例子返回结果等于3,表示有3个数据成功转换,转换成功数目同时取决于被解析的字符串以及其转换格式,如果我们把例子中的格式改为”%04d%02d”,那么sscanf将只返回2,day的数值不会被sscanf更改。   浮点数转换   输出结果:   converted=2, longitude=113., latitude=31.   sscanf的格式字符串中,f表示这是一个浮点数,其修饰词l表示这是一个double的浮点数。   2. sscanf的高级用法   数字+字符串   输出结果:   str=   上面的格式中,[0-9]表示这是一个仅包含0-9这几个字符的字符串,前面使用数字31修饰词表示这个字符串缓冲区的最大长度(这也是sscanf最为人诟病的地方,很容易出现缓冲区溢出错误,实际上sscanf是可以避免出现缓冲区溢出的,只要在书写任何字符串解析的格式时,注意加上其缓冲区尺寸的限制)。   输出结果:   str=abcdedf   在格式[]中增加了a-z的描述。   使用^示例:   输出结果:   str=   在[]中增加表示相反的意思,上面的[a-z]表示一个不包含任何a-z之间的字符串。   使用*的例子:   输出结果:   ret=1, str=abcdedf   加上*修饰表示一个被忽略的数据,同时也不需要为它准备空间存放解析结果。如上面的例子中,我们就只使用了str一个参数存放%31[a-z]的解析结果,而sscanf也只返回1,表示只解析了一个数据。   掌握了[], ^, *如何使用后,我们会发现sscanf原来是一个如此强大的工具,很多我们原先认为必须使用正则表达式的地方,很可能使用sscanf就可以实现。   sscanf的具体用法:   输出:   str=1234   time = 2021-10-18 14:55:34   str = 12345   str = acc   world   str =   str = 12345+

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/73707.html

(0)
上一篇 2024年 8月 5日
下一篇 2024年 8月 5日

相关推荐

关注微信