最近在使用sprintf構造字串時遇到的乙個問題

2021-06-21 16:16:00 字數 1172 閱讀 1674

直接上**:

#include #include int main();	

char szdst[20] = ;

int i;

memset(sztmp, 'a', sizeof(sztmp)-1);

sprintf(sztmp, "%d", 2);

printf("%s\n\n", sztmp);

for (i = 0; i < sizeof(sztmp); i++)

sprintf(szdst, 「%s」, szdst);

printf(「szdst: %s\n」, szdst);

return 0;

}

程式的執行結果是:

sztmp[0] = 50

sztmp[1] = 0

sztmp[2] = 97

sztmp[3] = 97

sztmp[4] = 97

sztmp[5] = 97

sztmp[6] = 97

sztmp[7] = 97

sztmp[8] = 97

sztmp[9] = 97

sztmp[10] = 97

sztmp[11] = 97

sztmp[12] = 97

sztmp[13] = 97

sztmp[14] = 97

sztmp[15] = 97

sztmp[16] = 97

sztmp[17] = 97

sztmp[18] = 97

sztmp[19] = 0

szdst: 2

這段**的意圖是生成乙個19個位元組的字串,第乙個字元是』2』,其它字元使用字元'a』填充,最後賦值給szdst。預計最後輸出為szdst: 2aaaaaaaaaaaaaaaaaa,可實際最後的輸出是szdst:2。why?

通過排查,最後發現問題出現在第乙個sprintf處,上面的列印已經很清楚地說明了問題,sprintf在構造乙個字串後會自動在末尾加上結束標誌』\0』。因此,在第二次使用sprintf時,由於該呼叫碰到結束符就返回了,故最後生成的字串只剩下了」2」。

這個小小的問題,平時基本沒怎麼留意過,系統自動對變數的修改總是有點讓人措手不及。後來上網查了下sprintf的用法,才發現該函式實在是問題多多,使用需慎重、慎重……

shell指令碼中字串比較經常遇到的乙個問題

1.大於小於符號必須轉義,否則shell會把他們當作重定向符合而把字串值當作檔名,如果不注意,可能刀子乙個不易察覺的嚴重問題。編寫 測試下 root wl ms 7673 chmod u x badtest root wl ms 7673 badtest baseball is greater th...

記乙個開發是遇到的坑之Oralce 字串排序

簡單描述一下情況,就是儲存過程中用乙個字串型別的字段作為患者就診的排序號,結果莫名發現叫完1號後叫了11 12等患者。使用者的反饋不一定準確,自己加了日誌的,趕緊拷貝日誌來觀察一下。結果發現實際情況就是這樣的,一邊說著不應該呀,一邊開始看 乙個個分析排序用到的字段,經過分析後發現由於這個欄位是字串所...

使用陣列輸入乙個字串,統計每部分字元的個數

使用陣列輸入乙個字串,統計每部分字元的個數 int main 程式入口,主函式,從這裡開始執行 else if str i a str i z else if str i 0 str i 9 else if str i else printf 小寫 d,大寫 d,數字 d,空格 d,其他 d sma...