【C 語言入門】191.可修改內容的多個字串

我們在上一篇文章有說到,使用二維陣列存的話,我們可以把每個字元都修改;而用指標陣列存的話,可以直接對整個字串修改。

同時呢,他們也有各自的缺點,使用二維陣列直接存字元的話,我們直接改字串會比較麻煩;而用指標陣列存字串的話,我們又沒有辦法改每個字元。

char strA[3][4] = {"How", "are", "you"};
const char *strB[3] = {"How", "are", "you"};


strA[2][0] = 'Y';         //(O)
strA[0] = "What";         //(X)
strcpy(strA[0], "What")   //(X)

strB[2][0] = 'Y';         //(X)
strB[0] = "What";         //(O)
strcpy(strB[0], "What")   //(X)

於是我們的程式可以這樣寫。

char strA[3][4] = {"How", "are", "you"};
char *strB[3] = {strA[0], strA[1], strA[2]};

儲存的東西不一樣,就影響了它們可以修改的東西不一樣。

如果我們讓 strB 字串的每個位置都去存 strA 裡面每個字串的開頭的位址的話,這樣就可以同時獲得二維陣列和指標陣列的好處。

我們可以直接修改每個字元,也可以直接修改整個字串。

char strA[3][4] = {"How", "are", "you"};
char *strB[3] = {strA[0], strA[1], strA[2]};

strB[2][0] = 'Y';        //(O)

strB[2] 其實就是 strA[2] ,而 strB[2][0] 也就是 ‘y’。

這樣我們就可以輕易改到字元了。

那如果我們要對字串進行更改呢?

strB[0] = "What";        //(?)

What 本身是字串的字面常數,如果要直接轉成指標的話,這些內容是不能改的,是 const。

我們希望 strB 指向的字串像 strA 裡面這些字元一樣,是可以修改的。

因此 strB[0] = “What”; 這樣的轉型是有問題的。

我們必須想辦法讓我們產生的這些格子不是 const,可以更改。

我們都知道,雙引號是不能直接改成指標的。

但是如果我們先把它存在字元陣列,這樣是 strC。

然後再把字元陣列的位址,存在 strB 指標的話,這樣就可以成功更改了。

char strA[3][4] = {"How", "are", "you"};
char *strB[3] = {strA[0], strA[1], strA[2]};

strB[2][0] = 'Y';             //(O)
char strC[5] = "What";        //(O)
strB[0] = strC;               //(O)
strB[0][0] = 'w';             //(O)

我們可以把 strC 的開頭位址存在 strB[0],這樣 strB[0] 就從原本指向 “How” 這個字串改成指向 “What” 這個字串。

因此當我們去存取 strB[0][0] 的時候,我們也可以修改字元。

但是這個方法會讓你原本的字串沒辦法使用,而且會一直佔據記憶體的空間。

Leave a Comment

Your email address will not be published. Required fields are marked *