C語言筆記-文本處理(2)常數字串的陷阱,用 strdup 處理
以下程式創了兩個字串:
兩種都產生了一個字串,但編譯器會用不同的方式去處理,如果不熟悉就容易造成錯誤。
"First"就是在一個空間規劃好噁的位置上,S1直接指向這個位址,如此的簡單快速
閱讀程式碼s1跟s2的行為是相同的,但是我們無法修改也不能去釋放s1
如果加上:
s1指定的內容是絕對唯讀的。
這個錯誤在我一開始踏入這行的時候遇過,被折騰了一下子
有一個簡單的方解決方法:strdup。 這是 POSIX的標準函式,字串複製(string duplicate)的簡寫:
"First"也是以硬編碼的方式寫入,但s3視這個常數字串的一份複製,所以可以自由修改。
用strdup就可以用同一種方式處理自串,不用擔心踩雷。
如果不支援strdup,就用asprintf自己寫一個
include <stdio .h=""> int main(void) { char *s1="First"; char *s2; asprintf(&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(&out,"%s",in): return out; }
留言
張貼留言