sprintf() 的整个介面长的样子的是:
int sprintf ( char * str, const char * format, ... )
也就是在使用前,必须要先建立好一个字元阵列的空间,再用这个函式把内容填入,下面就是简单的例子:
int tmp = 10;
char cstr[20];
sprintf( cstr, "%d * %d = %d", tmp, tmp, tmp * tmp );
在这个例子里,cstr 最后的值,会是「10 * 10 = 100」,看起来好像很好?但是如果把 tmp 的值改成 10000 的话,cstr 则应该要变成「10000 * 10000 = 100000000」,但是由於这时候的字串所需长度为 26,而要写入的 cstr 的长度只有 20,所以就会造成 buffer overflow 的问题。
像如果是以 Visual C++ 2006 来编译的话,如果程式里有用到 sprintf(),他在编译时就会显示一个警告讯息:
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead.
而要怎麼避免 sprintf 的 buffer overflow 的问题呢?除了微软建议的 sprintf_s() 外,实际上在 C99 里, 也多了一个 snprinf() 是用来取代现有的 sprintf() 了~他的介面是:
int snprintf(char *str, size_t size, const char * restrict format, ...)
应该可以明显看得出来,snprinf() 这个函式比 sprintf() 多了一个参数 size;这个参数的用处,就是用来限制最大的写入资料量,可以用来避免 buffer overflow。以上面的例子来说,本来写:
int tmp = 10000;
char cstr[20];
sprintf( cstr, "%d * %d = %d", tmp, tmp, tmp * tmp );
的话,会产生 buffer overflow 的问题。而如果改成用 snprinf() 的话,就是变成:
int tmp = 10000;
char cstr[20];
snprintf( cstr, sizeof( cstr ), "%d * %d = %d", tmp, tmp, tmp * tmp );
这样一来,snprinf() 在把资料写到 cstr 时,最多就只会写入 20 个字元(cstr 的长度),而不会有 buffer overflow 的问题了~
不过比较讨厌的是,MSVC 似乎并没有直接给这个函式,而是另外给了一个 _snprinf()…虽然功能和参数都大同小异,但是光函式名称不一样,就已经增加了些麻烦,更别说在行为模式上也有些不同了。而 _snprinf() 和 snprintf() 主要的差别在於:
_snprintf() (MSVC) snprintf()
回传值当 len <= size 时,会回传 len
当 len > size 时,会回传负值(-1)
正常状况会回传 len。
如果有错误,回传负值(-1)
字串内容当 len < size 时,str 会包含结尾的 '\0'
当 len >= size 时,str 不会有结尾的 '\0'
str 会包含结尾的 '\0'
len:要输出的字串应有的长度,不包含结尾的 '\0'。
size:snprintf / _snprintf 的第二个参数,写到 str 的最大资料量。
所以如果要跨平台,大致上应该可以:
如果是使用 MSVC 的话,自行定义 snprintf,让它变成 _snprintf
#ifdef _MSC_VER
#define snprintf _snprintf
#endif
实际使用,则就可以直接用 snprintf
int tmp = 10000;
char cstr[20];
int size = sizeof( cstr );
int c = snprintf( cstr, size, "%d * %d = %d", tmp, tmp, tmp*tmp );
if( c > size || c < 0 )
cstr[ size 1 ] = '\0';
这样应该就可以在 g++ 和 MSVC 的环境里,都可以避免 buffer overflow 和字串结尾没有 '\0' 的问题了~
但是这样的做法,实际上是产生一个最大长度为 20 的字串,如果超过的话,虽然不会有 buffer overflow 的问题,但是过长的部分还是要切掉。而如果希望可以针对需要,产生一个够长的字串的话,其实还可以使用 asprintf() 这个函式。他的用法很简单,基本上和 sprintf() 很像,只是将第一个参数改成一个 char** 而已;下方就是简单的范例:
char* cstr;
int c = asprintf( &cstr, "%d * %d = %d", tmp, tmp, tmp*tmp );
如此一来,他就会自动替 cstr 产生一块够大的记忆体空间,来存放字串了~
不过 asprintf() 这个函式应该不在 C 语言的标准内,而是 GNU 的 extension(可能要加上「#define _GNU_SOURCE」才能使用),所以在 MSVC 里并没有提供 asprintf() 可以使用。不过虽然没有现成的可以用,但是还是可以透过执行两次 snprintf() 来做到同样的功能~实作的方法,大致上就是:
char* cstr;
int c = snprintf( NULL, 0, "%d * %d = %d", tmp, tmp, tmp*tmp );
cstr = new char[ c + 1 ];
snprintf( cstr, c + 1, "%d * %d = %d", tmp, tmp, tmp*tmp );
做法的主要概念,就是第一次的 _snprintf() 实际上并不真正的将字串写到某个空间,而是单纯用来取得字串所需要的长度,然后再根据需要的长度来产生字元阵列,并将资料写入。
int sprintf ( char * str, const char * format, ... )
也就是在使用前,必须要先建立好一个字元阵列的空间,再用这个函式把内容填入,下面就是简单的例子:
int tmp = 10;
char cstr[20];
sprintf( cstr, "%d * %d = %d", tmp, tmp, tmp * tmp );
在这个例子里,cstr 最后的值,会是「10 * 10 = 100」,看起来好像很好?但是如果把 tmp 的值改成 10000 的话,cstr 则应该要变成「10000 * 10000 = 100000000」,但是由於这时候的字串所需长度为 26,而要写入的 cstr 的长度只有 20,所以就会造成 buffer overflow 的问题。
像如果是以 Visual C++ 2006 来编译的话,如果程式里有用到 sprintf(),他在编译时就会显示一个警告讯息:
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead.
而要怎麼避免 sprintf 的 buffer overflow 的问题呢?除了微软建议的 sprintf_s() 外,实际上在 C99 里, 也多了一个 snprinf() 是用来取代现有的 sprintf() 了~他的介面是:
int snprintf(char *str, size_t size, const char * restrict format, ...)
应该可以明显看得出来,snprinf() 这个函式比 sprintf() 多了一个参数 size;这个参数的用处,就是用来限制最大的写入资料量,可以用来避免 buffer overflow。以上面的例子来说,本来写:
int tmp = 10000;
char cstr[20];
sprintf( cstr, "%d * %d = %d", tmp, tmp, tmp * tmp );
的话,会产生 buffer overflow 的问题。而如果改成用 snprinf() 的话,就是变成:
int tmp = 10000;
char cstr[20];
snprintf( cstr, sizeof( cstr ), "%d * %d = %d", tmp, tmp, tmp * tmp );
这样一来,snprinf() 在把资料写到 cstr 时,最多就只会写入 20 个字元(cstr 的长度),而不会有 buffer overflow 的问题了~
不过比较讨厌的是,MSVC 似乎并没有直接给这个函式,而是另外给了一个 _snprinf()…虽然功能和参数都大同小异,但是光函式名称不一样,就已经增加了些麻烦,更别说在行为模式上也有些不同了。而 _snprinf() 和 snprintf() 主要的差别在於:
_snprintf() (MSVC) snprintf()
回传值当 len <= size 时,会回传 len
当 len > size 时,会回传负值(-1)
正常状况会回传 len。
如果有错误,回传负值(-1)
字串内容当 len < size 时,str 会包含结尾的 '\0'
当 len >= size 时,str 不会有结尾的 '\0'
str 会包含结尾的 '\0'
len:要输出的字串应有的长度,不包含结尾的 '\0'。
size:snprintf / _snprintf 的第二个参数,写到 str 的最大资料量。
所以如果要跨平台,大致上应该可以:
如果是使用 MSVC 的话,自行定义 snprintf,让它变成 _snprintf
#ifdef _MSC_VER
#define snprintf _snprintf
#endif
实际使用,则就可以直接用 snprintf
int tmp = 10000;
char cstr[20];
int size = sizeof( cstr );
int c = snprintf( cstr, size, "%d * %d = %d", tmp, tmp, tmp*tmp );
if( c > size || c < 0 )
cstr[ size 1 ] = '\0';
这样应该就可以在 g++ 和 MSVC 的环境里,都可以避免 buffer overflow 和字串结尾没有 '\0' 的问题了~
但是这样的做法,实际上是产生一个最大长度为 20 的字串,如果超过的话,虽然不会有 buffer overflow 的问题,但是过长的部分还是要切掉。而如果希望可以针对需要,产生一个够长的字串的话,其实还可以使用 asprintf() 这个函式。他的用法很简单,基本上和 sprintf() 很像,只是将第一个参数改成一个 char** 而已;下方就是简单的范例:
char* cstr;
int c = asprintf( &cstr, "%d * %d = %d", tmp, tmp, tmp*tmp );
如此一来,他就会自动替 cstr 产生一块够大的记忆体空间,来存放字串了~
不过 asprintf() 这个函式应该不在 C 语言的标准内,而是 GNU 的 extension(可能要加上「#define _GNU_SOURCE」才能使用),所以在 MSVC 里并没有提供 asprintf() 可以使用。不过虽然没有现成的可以用,但是还是可以透过执行两次 snprintf() 来做到同样的功能~实作的方法,大致上就是:
char* cstr;
int c = snprintf( NULL, 0, "%d * %d = %d", tmp, tmp, tmp*tmp );
cstr = new char[ c + 1 ];
snprintf( cstr, c + 1, "%d * %d = %d", tmp, tmp, tmp*tmp );
做法的主要概念,就是第一次的 _snprintf() 实际上并不真正的将字串写到某个空间,而是单纯用来取得字串所需要的长度,然后再根据需要的长度来产生字元阵列,并将资料写入。
发表评论
-
crond需要重启么?
2011-06-11 12:20 1224今天一同事说把A机器的/var/spool/cron/admi ... -
GDB信号的处理和启动配置文件(转载)
2011-05-22 21:57 2203信号的处理 程序是和网络相关的,调试期间经常地收到SIGPIP ... -
信号量基础知识
2011-05-10 18:40 985linux 中信号相关的一个结构体 struct sigact ... -
获取用户输入的问题(清除stdin)
2011-05-08 21:37 1907需求: 从终端获取用户输入的用户名和密码(有效 ... -
Linux下的UDP/TCP端口映射(netcat and socat)
2011-05-07 20:42 9665说起来有点土,事到如今 ... -
linux任务管理
2011-05-07 20:32 680disown是bash内部命令,nohup是外部命令 diso ... -
boost multi_index_container
2011-04-27 21:18 1524本章介绍的主题是multi_i ... -
变量相关命令(env,export,set,read, array, declare
2011-04-26 21:38 1001系统的预设参数文件:/ ... -
stl priority_queue
2011-04-26 21:20 601简单的使用示例。 view plaincopy to cli ... -
linux backlog
2011-04-25 15:13 1492在linux中,/proc/sys/net/core/so ... -
linux backlog
2011-04-25 15:13 730在linux中,/proc/sys/net/core/so ... -
stl hash_map
2011-04-23 19:57 749#include <cstdlib> #incl ... -
linux串口登陆
2011-04-23 09:31 1478在这个互连网高速发展的时代, 企业内网络设备的安全和运行稳定也 ... -
linux rename
2011-04-21 09:38 707Linux中rename命令的用法 刚学习linux的时候, ... -
stl heap
2011-04-17 10:01 767make_heap 原型: #include <a ... -
expand and upexpand
2011-04-09 13:33 707expand: NAME expand - co ... -
内核模块相关命令:lsmod,depmod,modprobe
2011-03-28 13:24 1108lsmod 功能:列出内核已载入模块的状态 用法:lsmod ... -
通过先unlink()后close()创建安全的临时文件
2011-03-15 14:26 883使用POSIX(Portable Operating Syst ... -
parted操作磁盘
2011-03-12 16:15 807除了fdisk命令,在linux下还有一个功能也非常强大的磁盘 ... -
linux写缓存调优
2011-03-11 09:34 2002我们在磁盘写操作持续 ...
相关推荐
qt实现的16进制显示控件,可以用来显示串口原始数据,同时支持字符串显示。资源为一个调用demo。用作参考。
我用来使编写程序更好的各种 C 实用程序。...xmalloc :对象检查 malloc、calloc、realloc、strdup、asprintf。 如果函数未能分配所需的内存,它将退出程序。 progressmeter : 一个很好的文件操作进度信息
5G通信行业、网络优化、通信工程建设资料
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Unity mesh减面工具 Mesh Simplify 1.12
网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
扫雷游戏是一款经典的计算机游戏,它的目标是在一个方格矩阵中找出所有隐藏的地雷。玩家需要通过点击方格来揭示其内容,如果方格中有地雷,则游戏结束;如果没有地雷,则会显示周围8个方格中地雷的数量。玩家需要根据这些信息来判断哪些方格是安全的,并继续点击其他方格。 在JAVA扫雷游戏程序中,我们使用了一个二维数组来表示游戏的方格矩阵。每个方格可以包含以下三种状态之一:未被揭示、有地雷或安全。我们还使用了一些辅助变量来跟踪游戏中的状态,例如已揭示的方格数量和剩余的地雷数量。 当玩家点击一个方格时,程序会检查该方格是否已经被揭示。如果是,则不做任何操作;否则,程序会揭示该方格的内容,并根据其是否包含地雷来更新游戏状态。如果方格中有地雷,则游戏结束;否则,程序会递归地揭示周围的方格,直到遇到已经揭示的方格为止。 为了提高游戏的可玩性,我们可以添加一些额外的功能,例如计时器、难度级别选择和自定义方格大小等。此外,我们还可以使用图形用户界面(GUI)来美化游戏界面,使其更加友好和易于操作。
仅供个人娱乐使用,不要乱用造成侵权,搬运自git删hub.co除m/ad中ang1345/Pyt文honW部ind分ows
【网络安全】网络安全视频教程56讲全在线地址.txt
299-企业数字化转型方案20220804.pptx
参考资料-人工智能对劳动力市场的影响机制研究.pdf
3D Facial Expressions through Analysis-by-Neural-Synthesis
AI设计工具-美图设计室:一键生成海报宣传画
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
5MHz 函数发生器使用说明书
网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
5G通信、网络优化与通信建设
5G通信、网络优化与通信建设
Unity 穿墙挖洞——CSG