函數原型: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 }
執行結果:
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函數不支持直接直接的拼接,需要首先保存好本體。
歡迎大家指正不對的地方哈
