sprintf和snprintf函数⽤法简介blog.csdn/hr10707020217/article/details/20861795
2014
函数原型
int sprintf(char *buffer, const char *format, [ argument] … );
字符串长度函数是什么
参数列表
buffer:char型指针,指向将要写⼊的字符串的缓冲区。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据。
返回值:字符串长度(strlen)
函数功能:
把格式化的数据写⼊某个字符串缓冲区。
常见⽤法:
[cpp] view plain copy
1. int main( void)
2. {
3.    char  buffer[200], s[] = "computer",c = 'l';
4.    int  i = 35, j;
5.    floatfp = 1.7320534f;
6.
7.    //Format and print various data:
8.    j = sprintf( buffer,    "  String:    %s\n", s );// C4996
9.    j += sprintf( buffer + j, "  Character:%c\n", c ); // C4996
10.    j += sprintf( buffer + j, "  Integer:  %d\n", i );// C4996
11.    j += sprintf( buffer + j, "  Real:      %f\n", fp );// C4996
12.    //Note: sprintf is deprecated; consider using sprintf_s instead
13.    printf( "Output:\n%s\ncharactercount = %d\n", buffer, j );
14. }
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 的话,将不会溢出。
常见⽤法:
[cpp] view plain copy
1. int main()
2. {
3.    charstr[10] = {'0'};
4.    snprintf(str, sizeof(str), "%s",123);
5.    printf("%s\n",str);
6. }
但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);就正确了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。