詳解C語言中的字符串拼接(堆與棧)
首先來看一個(gè)demo:
int do_sth(int type) {
char *errstr;
switch(type) {
case 1:
errstr = "Error";break
case 2:
errstr = "Warn";break
case 3:
errstr = "Info";break
case 4:
errstr = "Debug";break
default:
return 0;
}
if (...) {..}
if (...) {
..;
fprintf(stdout, "%s %s", errstr, ...);
return 1;
}
if (...) { return 1;}
if (...) {
fprintf(stderr, "%s %s", errstr, ...);
}
...
return 0;
}
問題: 如何在errstr信息前面添加一個(gè)HOSTNAME 環(huán)境變量信息?
考慮到errstr有可能寫到標(biāo)準(zhǔn)錯(cuò)誤,也有可能寫到標(biāo)準(zhǔn)輸出,也有可能根本就不輸出,所以,提前輸出HOSTNAME 信息顯然不合適
考慮到引用errstr的地方確實(shí)不少,最好一開始就拼接HOSTNAME到該errstr 上面去,那么如何拼接呢?
如果是在腳本語言或者帶有g(shù)c的語言中,完全可以直接在errstr變量前面拼接那個(gè)動(dòng)態(tài)獲取到的環(huán)境變量,如:
errstr=getenv("HOSTNAME") + errstr ;
但是c中卻不能這樣,為什么呢?字符串拼接的函數(shù)不是有的嗎,如:strcat;
事實(shí)卻并非如此簡單,為什么呢?
上面的errstr變量是存儲(chǔ)在棧上的,不需要考慮free的問題,原作者考慮到后續(xù)一大堆復(fù)雜的if分支,如果把errstr放在堆上,處處要考慮是不是該把errstr free掉,得死多少腦細(xì)胞啊!
對于HOSTNAME是個(gè)運(yùn)行時(shí)的信息,顯然沒法放到棧上,如果非要和errstr拼接起來的話,errstr必須在堆上,即要?jiǎng)討B(tài)的malloc,由此可見,對于腳本語言來講,一個(gè)非常簡單的邏輯,在C中卻如此的麻煩
解決辦法:
為了既不需要free,又能拼接字符串,可以定義一個(gè)字符數(shù)組,如: errstr[255],然后,把需要的信息加進(jìn)去;為了避免信息太多而不小心越界,可以使用snprintf函數(shù),自動(dòng)丟棄超長的部分
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
基于Matlab制作一個(gè)不良圖片檢測系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Matlab制作一個(gè)不良圖片檢測系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的可以跟隨小編一起了解一下2022-07-07
如何基于C語言socket編程實(shí)現(xiàn)TCP通信
本文介紹了如何基于C語言socket編程實(shí)現(xiàn)TCP通信,下面小編來簡單介紹下2019-05-05
C++中String的語法及常用接口的底層實(shí)現(xiàn)詳解
在C語言中,string是一個(gè)標(biāo)準(zhǔn)庫類(class),用于處理字符串,它提供了一種更高級、更便捷的字符串操作方式,string 類提供了一系列成員函數(shù)和重載運(yùn)算符,以便于對字符串進(jìn)行操作和處理,本編文章會(huì)對C++中的 string 進(jìn)行詳解,希望本篇文章會(huì)對你有所幫助2023-06-06
C語言中利用封裝好的函數(shù)實(shí)現(xiàn)英文字母的大小寫轉(zhuǎn)換
這篇文章主要介紹了C語言中利用封裝好的函數(shù)實(shí)現(xiàn)英文字母的大小寫轉(zhuǎn)換,需要的朋友可以參考下2017-10-10
C語言結(jié)構(gòu)及隊(duì)列實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了C語言實(shí)現(xiàn)隊(duì)列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
C語言實(shí)現(xiàn)經(jīng)典掃雷小游戲的示例代碼
掃雷游戲是在一個(gè)指定的二維空間里,隨機(jī)布置雷,把不是雷的位置都找出來,在你點(diǎn)一個(gè)位置的時(shí)候它會(huì)顯示它周圍全部雷的個(gè)數(shù),根據(jù)這個(gè)線索去找 ,會(huì)更容易贏。本文將用C語言實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以嘗試一下2022-11-11

