天天看點

char添加一個字元_C語言動态接收多個字元串

1. 背景與基本原理      在一些場合下,使用者往往需要動态輸入字元串,如果程式能夠自動接收傳進的字元串并進行計數,便可以達到動态接收的效果。基本原理是定義一個指向字元串指針的指針,對其進行進一步細化。我們期待程式能夠接收未知數量、未知長度的字元串,能夠動态儲存字元串。如圖1所示,設計一個這樣的結構便可以達成以上要去。

char添加一個字元_C語言動态接收多個字元串

圖1 字元串在記憶體中的排布基本思想如下,存放一個字元串,需要一定的記憶體空間(如圖中最右邊的部分),而這段空間需要有一個位址指向它(如圖1中中間部分),圖1中中間部分的記憶體中存放着指向字元串記憶體的位址(紫色位址)。當有多個字元串時,需要指向多個存放字元串的記憶體,是以将這些位址組合起來,存放在一段記憶體中。而這個記憶體也需要一個位址指向它,即圖1中黃色位址。 2. 資料結構整理我們知道指向一個字元串的位址為: 再有多個字元串時,該位址就會有多個,将其組合起來。最簡單的思路時将其存放在一個數組中,例如:     該數組有9個元素,每一個元素存放的是指向字元串的記憶體的位址。但是這種方法在定義字元串數組時會将其寫死,不利于動态擴充。    與字元串數組儲存多個字元串的原理基本一樣,将存放目标字元串們的數組空間用一塊記憶體代替。因為存放的類型是 char * ,是以指向這塊記憶體的位址便為 char **是以,定義一個二維指針用來描述這個字元串集合:     将其分解來看, char_grp指向的記憶體存放着一堆 char * ,而 char *則指向任意的字元串,是以要針對每一個字元串存放的空間申請記憶體。其次,我們的目的是往每一個 char *即圖1中紫色位址指向的記憶體中存放字元串。是以,申請一塊記憶體區域區域,用來儲存這一堆指向字元串位址的集合,然後在知道每個字元串的長度後,給指向字元串的記憶體申請空間。 3. 一個類比    類比于一個大家庭的開枝散葉過程,指向存放紫色位址的記憶體的位址,如圖中黃色的位址,看作是爺爺奶奶輩,這個位址指向的紫色位址為父母輩,可能有很多個父母、叔伯等,而父母、叔伯的下一輩即我們這一輩代表的是字元串。是以應該先給存放字元串集合的空間配置設定記憶體,再給集合中各字元串配置設定記憶體。先給爺爺奶奶輩、再給父母、叔伯輩,有了他們才能有子女輩的落腳點。 4. 一個簡單的實作    比如:我們要存放9個字元串會按照如下的方式。首先申請9個位址所占的記憶體空間,     此時chat_grp指向的記憶體空間可以存放9個,char * 的資料。接着在得知9個字元串長度的情況下,申請存放接收字元串的記憶體空間。 對字元串操作後,記得釋放記憶體。     這樣在我們讀到不定長度的字元串時,便可以使用該函數進行儲存以及處理。 5. 一個簡單的例子    使用 make指令後,生成test可執行檔案,其後可以添加任意數量、長度的字元串。之後的列印給出具體的記憶體申請以及釋放情況。

char添加一個字元_C語言動态接收多個字元串

                                                          圖2:運作示例

源碼擷取:

https://github.com/Meov/linux_learning_notes.git