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函數不支持直接直接的拼接,需要首先保存好本體。

歡迎大家指正不對的地方哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM