c語言如何輸入多個字串 C語言動態接收多個字串

2021-10-17 08:28:01 字數 1748 閱讀 2010

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

圖1 字串在記憶體中的排布基本思想如下,存放乙個字串,需要一定的記憶體空間(如圖中最右邊的部分),而這段空間需要有乙個位址指向它(如圖1中中間部分),圖1中中間部分的記憶體中存放著指向字串記憶體的位址(紫色位址)。當有多個字串時,需要指向多個存放字串的記憶體,因此將這些位址組合起來,存放在一段記憶體中。而這個記憶體也需要乙個位址指向它,即圖1中黃色位址。

char* str;char* str_arr[9];
該陣列有9個元素,每乙個元素存放的是指向字串的記憶體的位址。但是這種方法在定義字串陣列時會將其寫死,不利於動態擴充套件。    與字串陣列儲存多個字串的原理基本一樣,將存放目標字串們的陣列空間用一塊記憶體代替。因為存放的型別是

char * ,所以指向這塊記憶體的位址便為

char **因此,定義乙個二維指標用來描述這個字串集合:

char ** char_grp;
將其分解來看,char_grp指向的記憶體存放著一堆

char * ,而

char *則指向任意的字串,所以要針對每乙個字串存放的空間申請記憶體。其次,我們的目的是往每乙個

char *即圖1中紫色位址指向的記憶體中存放字串。因此,申請一塊記憶體區域區域,用來儲存這一堆指向字串位址的集合,然後在知道每個字串的長度後,給指向字串的記憶體申請空間。3. 乙個模擬模擬於乙個大家庭的開枝散葉過程,指向存放紫色位址的記憶體的位址,如圖中黃色的位址,看作是爺爺奶奶輩,這個位址指向的紫色位址為父母輩,可能有很多個父母、叔伯等,而父母、叔伯的下一輩即我們這一輩代表的是字串。因此應該先給存放字串集合的空間分配記憶體,再給集合中各字串分配記憶體。先給爺爺奶奶輩、再給父母、叔伯輩,有了他們才能有子女輩的落腳點。

char ** char_grp;chat_grp= (char **)malloc(sizeof(char *)*9);
此時chat_grp指向的記憶體空間可以存放9個,char * 的資料。接著在得知9個字串長度的情況下,申請存放接收字串的記憶體空間。
int i = 0;for (i = 0; i < string_num; i++)
對字串操作後,記得釋放記憶體。
for(i = string_num-1; i >= 0; i--)        //釋放黃色位址占用的記憶體空間        free(char_grp);
這樣在我們讀到不定長度的字串時,便可以使用該函式進行儲存以及處理。5. 乙個簡單的例子使用make命令後,生成test可執行檔案,其後可以新增任意數量、長度的字串。之後的列印給出具體的記憶體申請以及釋放情況。

圖2:執行示例原始碼獲取:

printf多個字串 C語言字串詳解

字串是一種非常重要的資料型別,但是c語言不存在顯式的字串型別,c語言中的字串都以字串常量的形式出現或儲存在字元陣列中。同時,c 語言提供了一系列庫函式來對操作字串,這些庫函式都包含在標頭檔案 string.h 中。1.1 什麼是字串常量 c 語言雖然沒有字串型別,但是 c語言提是存在字串這個概念的,...

C語言 氣泡排序排序多個字串

strcmp函式 原型 extern int strcmp const char s1,const char s2 用法 include 功能 比較字串s1和s2。一般形式 strcmp 字串1,字串2 說明 當s1s2時,返回值 0 即 兩個字串自左向右逐個字元相比 按ascii值大小相比較 直到...

C語言 寫氣泡排序可以排序多個字串。

此題的解決思路為 首先整體思路為氣泡排序法,其次它是要排序多個字串,這裡就要用到字串的比較strcmp,通過判斷比較兩字串然後再進行交換排序。具體 如下 include include include void bubble str char arr,int sz int main int i 0 ...