linux下snprintf和sprinf很少被提及的区别

函数原型:int snprintf(char *dest, size_t size, const char *fmt, ...);
函数说明:

snprintf函数中的第二个参数,size的解释:size是限定最终生成的dest的字符数,最多拷贝size-1个字符; 一般情况下size会取sizeof(dest),这是为了dst不溢出. 在snprintf(dest, size, "str: %s\n", src)中如果size-1大于等于"str: %s\n"的长度,则把"str: %s\n"都拷贝到dst, 如果size-1小于"str: %s\n"的长度,则从"str: %s\n"拷贝size-1长度的字符串到dst,并且末尾置\0.

至于sprintf的的溢出,网上很多。再次不做说明。下面说说很少被提及到的区别:

先上代码1:

 1 #include<stdio.h>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 int main()
 6 {
 7     int i = 10;
 8     char tmp[128] = {0};
 9     char tmp_name[128] = "download";
10     char file_name[128]={0};
11     strcpy(file_name,"./");
12     strcat(file_name,tmp_name);
13     strcat(file_name,"/");
14     sprintf(file_name,"%s%d",file_name,i);
15     printf("file_name is: %s\n",file_name);
16     return 0;
17 }
View Code

执行结果:

file_name is: ./downlaod/10

代码2:

 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 int main()
 6 {
 7     int i = 10;
 8     char tmp[128] = {0};
 9     char tmp_name[128] = "download";
10     char file_name[128]={0};
11     strcpy(file_name,"./");
12     strcat(file_name,tmp_name);
13     strcat(file_name,"/");
14     snprintf(tmp, sizeof(tmp), "%s",file_name);
15     snprintf(file_name, sizeof(file_name), "%s%d",tmp,i);
16     printf("file_name is: %s\n",file_name);
17     return 0;
18 }

执行结果:file_name is: ./download/10

如果将代码2的第14行注释掉,同时修改15行代码为:snprintf(file_name, sizeof(file_name), "%s%d",file_name,i);

代码执行结果:file_name is: 10

现在应该明白二者的一个区别了吧,总结为:

sprintf函数可以直接用于在原有的字符串(不一定是字符串)直接进行拼接;然而snprintf函数不支持直接直接的拼接,需要首先保存好本体。

欢迎大家指正不对的地方哈

posted @ 2014-02-21 15:48  小树成长  阅读(2032)  评论(11编辑  收藏  举报