天天看点

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