string 與 char [ ] 互轉

c_str()函數返回一個常數字元陣列指標指向正規 C 字元陣列。
因為是常數,所以無法對陣列內容修改。

const char * 指標說明:

範例一:
char a[]="xyz";//a 字串內容可以修改
const char b[]="12";//b 字串內容不能修改
const char *p;//p 為常數字元陣列指標

a[0]='T';//a 內容可以修改
b[0]='T';//這是錯的,b 為 const 不能修改。
p=a;//p 可以指向 a 字元陣列,但不能修改 a 字串內容。
*p='T';//這是錯的,因為 p 為 const char*,所以不能修改指向的記憶體內容。
p=b;//p 也可以指向 b 字元陣列,也是不能修改內容。

*p='T';//這是錯的,因為 p 為 const char*,所以不能修改指向的記憶體內容。




c 的 char[] 或 char * 的字串運算並不好用,因此 c++ 才會有 string 的物件。
但 string 與 char 並不能相容,必須透過 c_str() 才能互相交流。
下列堤供如何使用 char [] 或 char * 與 string.c_str() 運算。

範例二:
char a[]="xyz";//如此宣告,a 只有 4 個空間
string x;
a = a + "123";//錯誤,陣列無法如此運算
x=a;//string 可以接收 char []
x="1"+x+"23";//string 可以靈活運算字串
a=x;//錯誤,陣列字元無法接收 string
strcpy(a,x);//只能使用傳統 strcpy 做複製,但 strcpy 無法接受 string
strcpy(a,x.c_str());//strcpy 只能接受 const char *,因此必須使用 c_str()
上面用法雖然正確,但會有 bug,因為 a[] 只有 4 個空間,去除字串結尾字元 '\0',只剩 3 個字, 然而 x 為 "1xyz23" 共 6 個字,因此 strcpy 會將 6 個字複製到 3 個空間,勢必不足。

結論:
char [] 運算可使用 string 協助運算,等最後結果再使用 strcpy 將 string.c_str() 複製到 char [], 但要注意 char [] 可使用空間。
string 若要使用傳統函數,例如: strcpy、atoi、atof...等函數,則應使用 c_str() 函數。

char [] 設定給 string ==> string = char []
string 設定給 char [] ==> strcpy(char[] , string.c_str())//char[] 空間需大於 string 長度。