char添加一个字符_C语言动态接收多个字符串
生活随笔
收集整理的這篇文章主要介紹了
char添加一个字符_C语言动态接收多个字符串
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 背景與基本原理? ????在一些場合下,用戶往往需要?jiǎng)討B(tài)輸入字符串,如果程序能夠自動(dòng)接收傳進(jìn)的字符串并進(jìn)行計(jì)數(shù),便可以達(dá)到動(dòng)態(tài)接收的效果。基本原理是定義一個(gè)指向字符串指針的指針,對其進(jìn)行進(jìn)一步細(xì)化。我們期待程序能夠接收未知數(shù)量、未知長度的字符串,能夠動(dòng)態(tài)保存字符串。如圖1所示,設(shè)計(jì)一個(gè)這樣的結(jié)構(gòu)便可以達(dá)成以上要去。圖1 字符串在內(nèi)存中的排布基本思想如下,存放一個(gè)字符串,需要一定的內(nèi)存空間(如圖中最右邊的部分),而這段空間需要有一個(gè)地址指向它(如圖1中中間部分),圖1中中間部分的內(nèi)存中存放著指向字符串內(nèi)存的地址(紫色地址)。當(dāng)有多個(gè)字符串時(shí),需要指向多個(gè)存放字符串的內(nèi)存,因此將這些地址組合起來,存放在一段內(nèi)存中。而這個(gè)內(nèi)存也需要一個(gè)地址指向它,即圖1中黃色地址。2. 數(shù)據(jù)結(jié)構(gòu)整理我們知道指向一個(gè)字符串的地址為:?char*?str;再有多個(gè)字符串時(shí),該地址就會(huì)有多個(gè),將其組合起來。最簡單的思路時(shí)將其存放在一個(gè)數(shù)組中,例如: char* str_arr[9];????該數(shù)組有9個(gè)元素,每一個(gè)元素存放的是指向字符串的內(nèi)存的地址。但是這種方法在定義字符串?dāng)?shù)組時(shí)會(huì)將其寫死,不利于動(dòng)態(tài)擴(kuò)展。????與字符串?dāng)?shù)組保存多個(gè)字符串的原理基本一樣,將存放目標(biāo)字符串們的數(shù)組空間用一塊內(nèi)存代替。因?yàn)榇娣诺念愋褪莄har * ,所以指向這塊內(nèi)存的地址便為 char **因此,定義一個(gè)二維指針用來描述這個(gè)字符串集合:char ** char_grp;????將其分解來看,char_grp指向的內(nèi)存存放著一堆 char * ,而char *則指向任意的字符串,所以要針對每一個(gè)字符串存放的空間申請內(nèi)存。其次,我們的目的是往每一個(gè)char *即圖1中紫色地址指向的內(nèi)存中存放字符串。因此,申請一塊內(nèi)存區(qū)域區(qū)域,用來保存這一堆指向字符串地址的集合,然后在知道每個(gè)字符串的長度后,給指向字符串的內(nèi)存申請空間。3. 一個(gè)類比????類比于一個(gè)大家庭的開枝散葉過程,指向存放紫色地址的內(nèi)存的地址,如圖中黃色的地址,看作是爺爺奶奶輩,這個(gè)地址指向的紫色地址為父母輩,可能有很多個(gè)父母、叔伯等,而父母、叔伯的下一輩即我們這一輩代表的是字符串。因此應(yīng)該先給存放字符串集合的空間分配內(nèi)存,再給集合中各字符串分配內(nèi)存。先給爺爺奶奶輩、再給父母、叔伯輩,有了他們才能有子女輩的落腳點(diǎn)。4. 一個(gè)簡單的實(shí)現(xiàn)????比如:我們要存放9個(gè)字符串會(huì)按照如下的方式。首先申請9個(gè)地址所占的內(nèi)存空間,char ** char_grp;chat_grp= (char **)malloc(sizeof(char *)*9);????此時(shí)chat_grp指向的內(nèi)存空間可以存放9個(gè),char * 的數(shù)據(jù)。接著在得知9個(gè)字符串長度的情況下,申請存放接收字符串的內(nèi)存空間。int i = 0;for (i = 0; i < string_num; i++) {?????char_grp[i]?=(char?*)malloc(sizeof(char)?*?str_len);}對字符串操作后,記得釋放內(nèi)存。for(i = string_num-1; i >= 0; i--){????????//釋放紫色地址指向的內(nèi)存空間????????printf("chat_grp[%d]:?addr?:?%p?freed!\n" ,i,chat_grp[i]);????????free(char_grp[i]);????????chat_grp[i]?=?NULL; } //釋放黃色地址占用的內(nèi)存空間????????free(char_grp);????這樣在我們讀到不定長度的字符串時(shí),便可以使用該函數(shù)進(jìn)行保存以及處理。5. 一個(gè)簡單的例子????使用make命令后,生成test可執(zhí)行文件,其后可以添加任意數(shù)量、長度的字符串。之后的打印給出具體的內(nèi)存申請以及釋放情況。????? ????????????????????????????????????????????????????圖2:運(yùn)行示例
源碼獲取:
https://github.com/Meov/linux_learning_notes.git
源碼獲取:
https://github.com/Meov/linux_learning_notes.git
總結(jié)
以上是生活随笔為你收集整理的char添加一个字符_C语言动态接收多个字符串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jieba是python中一个重要的标准
- 下一篇: python动态显示进度条_实例详解py