基于C++中sprintf的錯(cuò)誤總結(jié)詳解
更新時(shí)間:2013年05月16日 17:07:37 作者:
本篇文章是對(duì)C++中sprintf的錯(cuò)誤進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
sprintf 是個(gè)變參函數(shù),使用時(shí)經(jīng)常出問題,而且只要出問題通常就是能導(dǎo)致程序崩潰的內(nèi)存訪問錯(cuò)誤。
下面對(duì)sprintf 常出錯(cuò)誤問題進(jìn)行簡(jiǎn)單的總結(jié):
1、緩沖區(qū)溢出:第一個(gè)參數(shù)的長(zhǎng)度太短了,解決辦法:將第一個(gè)參數(shù)的長(zhǎng)度擴(kuò)大。打印字符串時(shí),盡量使用”%.ns”的形式指定最大字符數(shù)
char buf[5];
sprintf(buf, ":%d", 3246);
printf("buf is %s\n", buf);
將buf修改為char buf[6]
2、忘記第一個(gè)參數(shù):原因用printf 用得用習(xí)慣了,偶爾會(huì)忘記
char buf[6];
sprintf(":%d", 3246);
printf("buf is %s\n", buf);
錯(cuò)誤提示: error C2664: 'sprintf' : cannot convert parameter 2 from 'int' to 'const char *'
3、變參對(duì)應(yīng)出問題:通常是忘記了提供對(duì)應(yīng)某個(gè)格式符的變參,導(dǎo)致以后的參數(shù)統(tǒng)統(tǒng)錯(cuò)位,檢查檢查吧。尤其是對(duì)應(yīng)”*”的那些參數(shù),都提供了嗎?
不要把一個(gè)整數(shù)對(duì)應(yīng)一個(gè)”%s”
char buf[100];
int a=6;
sprintf(buf, ":%d,%s", 3246,a);
printf("buf is %s\n", buf);
溫馨提示:a對(duì)應(yīng)的應(yīng)該是%d而不是%s
4、還有下面這種錯(cuò)誤,我只能意會(huì)不知道怎么來描述?,F(xiàn)在給出錯(cuò)誤的代碼和正確的代碼的例子。大家自己看吧~~
錯(cuò)誤的代碼
char buf[15];
char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
sprintf(buf, "%s%s", a1, a2); //出現(xiàn)亂碼,得出的結(jié)果并非我們所需要的
printf("buf is %s\n", buf);
正確的代碼
char buf[15];
char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
sprintf(buf, "%.7s%.7s", a1, a2);//產(chǎn)生:"ABCDEFGHIJKLMN"
printf("buf is %s\n", buf);
下面對(duì)sprintf 常出錯(cuò)誤問題進(jìn)行簡(jiǎn)單的總結(jié):
1、緩沖區(qū)溢出:第一個(gè)參數(shù)的長(zhǎng)度太短了,解決辦法:將第一個(gè)參數(shù)的長(zhǎng)度擴(kuò)大。打印字符串時(shí),盡量使用”%.ns”的形式指定最大字符數(shù)
char buf[5];
sprintf(buf, ":%d", 3246);
printf("buf is %s\n", buf);
將buf修改為char buf[6]
2、忘記第一個(gè)參數(shù):原因用printf 用得用習(xí)慣了,偶爾會(huì)忘記
char buf[6];
sprintf(":%d", 3246);
printf("buf is %s\n", buf);
錯(cuò)誤提示: error C2664: 'sprintf' : cannot convert parameter 2 from 'int' to 'const char *'
3、變參對(duì)應(yīng)出問題:通常是忘記了提供對(duì)應(yīng)某個(gè)格式符的變參,導(dǎo)致以后的參數(shù)統(tǒng)統(tǒng)錯(cuò)位,檢查檢查吧。尤其是對(duì)應(yīng)”*”的那些參數(shù),都提供了嗎?
不要把一個(gè)整數(shù)對(duì)應(yīng)一個(gè)”%s”
char buf[100];
int a=6;
sprintf(buf, ":%d,%s", 3246,a);
printf("buf is %s\n", buf);
溫馨提示:a對(duì)應(yīng)的應(yīng)該是%d而不是%s
4、還有下面這種錯(cuò)誤,我只能意會(huì)不知道怎么來描述?,F(xiàn)在給出錯(cuò)誤的代碼和正確的代碼的例子。大家自己看吧~~
錯(cuò)誤的代碼
char buf[15];
char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
sprintf(buf, "%s%s", a1, a2); //出現(xiàn)亂碼,得出的結(jié)果并非我們所需要的
printf("buf is %s\n", buf);
正確的代碼
char buf[15];
char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
sprintf(buf, "%.7s%.7s", a1, a2);//產(chǎn)生:"ABCDEFGHIJKLMN"
printf("buf is %s\n", buf);
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(347.前K個(gè)高頻元素)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(347.前K個(gè)高頻元素),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
整型數(shù)據(jù)在內(nèi)存中存儲(chǔ)方式的講解
今天小編就為大家分享一篇關(guān)于整型數(shù)據(jù)在內(nèi)存中存儲(chǔ)方式的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
C語言數(shù)據(jù)結(jié)構(gòu)之算法的時(shí)間復(fù)雜度
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之算法的時(shí)間復(fù)雜度,文章基于c語言的相關(guān)資料展開詳細(xì)介紹,具有一定的參價(jià)值,需要的小伙伴可以參考一下2022-05-05
C++構(gòu)造函數(shù)的類型,淺拷貝與深拷貝詳解
這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造函數(shù)的類型,淺拷貝與深拷貝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
C++ std::unique_lock 用法實(shí)例詳解
std::unique_lock 是 C++11 提供的一個(gè)用于管理互斥鎖的類,它提供了更靈活的鎖管理功能,適用于各種多線程場(chǎng)景,這篇文章給大家介紹了C++ std::unique_lock 用法,感興趣的朋友跟隨小編一起看看吧2023-09-09

