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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
执行结果:
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函数不支持直接直接的拼接,需要首先保存好本体。
欢迎大家指正不对的地方哈