C語言筆記-文本處理(3) 用asprintf strdup 做一個實用的可拓展字串的宏定義
用asprintf()把一段文字添加到另一個字串尾部:
如果今天很多字串要處理,變成
Sasprintf宏加上strdup,差不多100%的字串處理都能應付了,除了一個下面提到的問題乙級偶爾需要使用free外,可以不必續考慮記憶體的問體。
這個問題是:
如果q沒有初始為NULL或是忘記使用strdup,那麼第一次使用Sasprintf宏將會釋放q的位初始話位置所保存的數據,這會產生錯誤。
or
不過這種方式會降低處力速度,因為字串的第一部份每次都會被改寫,如果真的太慢就還是要換回傳統的snprintf來取代了。
此文章內容參考"21 century c"一書,在此做筆記
如須刪除請告知 謝謝
asprintf(&s,%s and other string: %s",s,add);
如果今天很多字串要處理,變成
int num=5,id=27; char *s=strdup("select"); asprintf(&s,"%sscol%i\n",s,num); asprintf(&s,"%sfrom tab\n",s); asprintf(&s,"%swhere person id=%i",s,id);
得到:
selectscol5
from tab
where person id=27
上面這樣看,除了不整潔 也很厭煩,
也有記憶體洩漏的風險在,因為s的原位址中的對向在asprintf向s提供一個心位置時不會被釋放掉,如果生成的字串數量是未知得,長度也是未知就可以透過宏定義來簡化:
#define Sasprintf(write_to, ...){ \
char *tmp_string_for_extend=(write_to); \
asprintf(&(write_to),__VA_ARGS__); \
free(tmp_string_for_extend); \
}
int main(void) { int i=666; char *q=NULL; char *k="Jack"; Sasprintf(q,"Hello~~ "); Sasprintf(q,"%s %s Nice to meet you %d.",q,k,i); printf("%s\n",q); }
Sasprintf宏加上strdup,差不多100%的字串處理都能應付了,除了一個下面提到的問題乙級偶爾需要使用free外,可以不必續考慮記憶體的問體。
這個問題是:
如果q沒有初始為NULL或是忘記使用strdup,那麼第一次使用Sasprintf宏將會釋放q的位初始話位置所保存的數據,這會產生錯誤。
char *q="Good Morning";//可用strdup包裝:char *q=strdup("Good Morning");
or
char *q;
不過這種方式會降低處力速度,因為字串的第一部份每次都會被改寫,如果真的太慢就還是要換回傳統的snprintf來取代了。
此文章內容參考"21 century c"一書,在此做筆記
如須刪除請告知 謝謝
留言
張貼留言