C語言筆記-文本處理(3) 用asprintf strdup 做一個實用的可拓展字串的宏定義
用asprintf()把一段文字添加到另一個字串尾部: 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宏將會釋放...