C語言筆記-文本處理(2)常數字串的陷阱,用 strdup 處理

以下程式創了兩個字串:

include <stdio .h="">



int main(void)

{

    char *s1="First";

    char *s2;

    asprintf(&amp;s2,"Second");



    printf("%s\n,s1);

    printf("%s\n,s2);



}


兩種都產生了一個字串,但編譯器會用不同的方式去處理,如果不熟悉就容易造成錯誤。


"First"就是在一個空間規劃好噁的位置上,S1直接指向這個位址,如此的簡單快速

閱讀程式碼s1跟s2的行為是相同的,但是我們無法修改也不能去釋放s1

如果加上:
s2[0]='f';

s1[0]='t';   //錯誤

free(s2);

free(s1);    //錯誤

s1指定的內容是絕對唯讀的。

這個錯誤在我一開始踏入這行的時候遇過,被折騰了一下子


有一個簡單的方解決方法:strdup。 這是 POSIX的標準函式,字串複製(string duplicate)的簡寫:

 char *s3=strdup("First");

"First"也是以硬編碼的方式寫入,但s3視這個常數字串的一份複製,所以可以自由修改。
用strdup就可以用同一種方式處理自串,不用擔心踩雷。

如果不支援strdup,就用asprintf自己寫一個
char *strdup(char const* in){

    if(!in) return NULL;

    char *out;

    asprintf(&amp;out,"%s",in):



    return out;

}





留言

這個網誌中的熱門文章

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

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

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