除了使用typedef char *并声明一个string类型的数组之外,还有更好的方法来维护C中的字符串列表吗?我正在尝试管理通过套接字程序加入该组的成员名称列表。但每次新成员加入该组时,旧成员名称都会被覆盖。部分示例代码如下:
typedef char * string;
string List[10];
和新成员加入如下:
List[index]=membername;
感谢。
答案 0 :(得分:2)
对于基本的C类型,您需要将List作为指针指针,然后为每个新成员名称重新分配它作为另一个字符串(或将其设置为常量最大字符串数量 - < strong>可能导致令人讨厌的内存溢出 - 但如果你调整索引是安全的。)
对于每个新成员名称,您需要为此成员名称分配char*
(c字符串),如果您只想存储此成员名称,则可以使用malloc(strlen(membername)+1)
为其分配空格null终止0。
完成此操作后,您将有内存插入字符串,请按strcpy(List[index++], membername)
执行此操作。
如果你选择静态最大数量的字符串,你必须使用strpcy(List[(index++)%ALLOCATEDSTRINGS,membername)
。
答案 1 :(得分:2)
这完全取决于membername
的分配方式。如果它是您重复使用的静态字符串,每次进入时都会使用新名称填充它,那么您将多次覆盖该字符串。存储指向字符串的指针不会存储字符串的内容,只会保存其地址。
要正确执行此操作,您需要为每个新名称分配(使用malloc()
)新字符串。然后将每个新的字符串指针分配给数组中的不同成员。
答案 2 :(得分:1)
你可能(没有足够的上下文)没有正确分配字符串。
string List[10];
仅分配10 string
的数组,即10 char *
,即10个字符指针。它不为字符串本身分配任何存储空间。
因此,如果您的上述membername
是您正在将数据从网络复制到的全局char *
,List
中的所有广告位将最终指向非常相同的内存位置。
要使其正常工作,您需要分配(并小心释放)List
中的所有广告位。类似的东西:
List[index] = strdup(membername);
为了更好地及早发现错误,最初将List
设置为所有空指针。
for (int i=0; i<10; i++) List[i] = NULL;
当用户“离开”时,释放并将该插槽重置为NULL:
free(List[index]);
List[index] = NULL;
如果你不仔细管理你的插槽,那么你会得到很好的,令人讨厌的段错误: - )
答案 3 :(得分:0)
我将使用已分配的char *数组,如果需要,可以使其动态增长数组。
所以你有:
char **List = calloc(num_members,sizeof(char *));
然后当有人加入你所拥有的小组时:
List[current_index] = calloc(strlen(new_user_name) + 1,sizeof(char));
strcpy(List[current_index++],new_user_name);
请记住,num_members
需要开始足够大以处理可能想要加入的成员,或者您不得不偶尔重新分配更大的阵列。