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宏將會釋放q的位初始話位置所保存的數據,這會產生錯誤。

char *q="Good Morning";//可用strdup包裝:char *q=strdup("Good Morning");

    or
char *q;

不過這種方式會降低處力速度,因為字串的第一部份每次都會被改寫,如果真的太慢就還是要換回傳統的snprintf來取代了。


此文章內容參考"21 century c"一書,在此做筆記
如須刪除請告知 謝謝

留言

這個網誌中的熱門文章

FreeRTOS學習筆記 (二)-任務創建和刪除(xTaskCreate及vTaskDelete)

FreeRTOS學習筆記 (三)-時間管理vTaskDelay()及vTaskDelayUntil()

C語言筆記-文本處理(1) 善用 asprintf取代sprintf