http://blog.csdn.net/hr10707020217/article/details/20861795 2014 函数原型 int sprintf(char *buffer, const char *format, [ argument] … ); 参数列表 buffer:char型指针,指向将要写入的字符串的缓冲区。 format:格式化字符串。 [argument]...:可选参数,可以是任何类型的数据。 返回值:字符串长度(strlen) 函数功能: 常见用法:
sprintf函数是一个变参函数,前两个函数有固定类型,会进行安全检查,后面的参数都不是类型安全的。使用的时要小心。还有一点就是sprintf() 的写操作可能会越过buffer的边界,从而产生一个缓冲区溢出。 要修正这一缺陷,可以使用函数snprintf()代替函数sprintf()。 函数原型 int snprintf(char *str, size_t size, const char *format, ...); 参数列表 str:char型指针,指向将要写入的字符串的缓冲区。 size:要写入str缓冲区的长度。 format:格式化字符串。 [argument]...:可选参数,可以是任何类型的数据。 返回值:字符串长度(strlen) 函数功能: 最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。 常见用法:
但snprintf()函数并不是标准c/c++中规定的函数,所以在许多编译器中,厂商提供了其相应的实现的版本。在gcc中,该函数名称就snprintf(),而在VS中称为_snprintf。所以在需要使用snprintf()时改成_snprintf就可以了,或则在预编译处加入: #if _MSC_VER #define snprintf _snprintf #endif 上面这个例子有个错误:这是我在写的过程中的误理解,函数基本功能把格式化的数据存储在字符串中,但是我以为是字符串,所以在转化的时候都以“%s”,这里错了,是什么类型就以什么类型转换,比如float类型,就以“%f”转换。所以改为snprintf(str, sizeof(str), "%d",123);就正确了。
|
|