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;
}
留言
張貼留言