在C中维护字符串数组的更好方法

在C中维护字符串数组的更好方法,c,pointers,C,Pointers,除了使用typedef char*和声明string类型的数组之外,还有更好的方法在C中维护字符串列表吗?我正在尝试管理通过套接字程序加入组的成员姓名列表。但每次新成员加入组时,旧成员名称都会被覆盖。部分示例代码如下所示: typedef char * string; string List[10]; List[index]=membername; 新成员的加入方式如下: typedef char * string; string List[10]; List[index]=membe

除了使用typedef char*和声明string类型的数组之外,还有更好的方法在C中维护字符串列表吗?我正在尝试管理通过套接字程序加入组的成员姓名列表。但每次新成员加入组时,旧成员名称都会被覆盖。部分示例代码如下所示:

typedef char * string;
string  List[10];
List[index]=membername;
新成员的加入方式如下:

typedef char * string;
string  List[10];
List[index]=membername;

谢谢。

对于基本C类型,您需要将列表作为指向指针,然后对于每个新成员名,将其重新定位为另一个字符串(或者将其设置为字符串的最大常量--,这可能会导致严重的内存溢出--,但如果您调整索引,它将是安全的)

  • 对于每个新的membername,您需要为此membername分配一个
    char*
    (c字符串),如果您只想存储此membername,则可以使用
    malloc(strlen(membername)+1)
    为以空结尾的0分配空间

  • 完成此操作后,您有内存插入字符串,请通过strcpy(List[index++],membername)执行此操作

  • 如果选择静态最大字符串量,则必须使用strpcy(List[(index++)%ALLOCATEDSTRINGS,membername)


对于基本C类型,您需要将列表作为指向指针,然后为每个新membername将其重新定位为另一个字符串(或者将其设置为字符串的最大常量--,这可能会导致严重的内存溢出--,但如果您调整索引,它将是安全的)

  • 对于每个新的membername,您需要为此membername分配一个
    char*
    (c字符串),如果您只想存储此membername,则可以使用
    malloc(strlen(membername)+1)
    为以空结尾的0分配空间

  • 完成此操作后,您有内存插入字符串,请通过strcpy(List[index++],membername)执行此操作

  • 如果选择静态最大字符串量,则必须使用strpcy(List[(index++)%ALLOCATEDSTRINGS,membername)


这一切都取决于
成员名的分配方式。如果它是一个可重复使用的静态字符串,则每次输入一个新名称时都会用新名称填充它,那么您将多次覆盖该字符串。存储指向该字符串的指针不会存储该字符串的内容,而只会保存其地址


要正确执行此操作,您需要分配(使用
malloc()
)每个新名称都有一个新字符串。然后,每个新字符串指针被分配给数组中的不同成员。

这一切都取决于
membername
的分配方式。如果它是一个可重复使用的静态字符串,则每次输入一个新名称时都用新名称填充它,则会多次覆盖该字符串。将指针存储到环不会存储字符串的内容,它只会保存其地址


要正确执行此操作,您需要(使用
malloc()
)为每个新名称分配一个新字符串。然后将每个新字符串指针分配给数组中的不同成员。

我将使用一个已分配字符的数组*,如果需要,将其设置为可以动态增长数组

所以你会:

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_成员
需要足够大,以处理尽可能多的想要加入的成员,否则您必须偶尔重新分配一个更大的数组。

我将使用一个分配字符*的数组,如果需要,将其设置为可以动态增长数组

所以你会:

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_成员
开始时需要足够大,以处理尽可能多的想要加入的成员,否则您必须偶尔重新分配更大的数组。

您可能(没有足够的上下文)没有正确分配字符串

string List[10];
仅分配10个
字符串的数组,即10个
字符*
,即10个字符指针。它不为字符串本身分配任何存储

因此,如果上面的
membername
是一个全局
char*
,您要将数据从网络复制到其中,那么
列表中的所有插槽都将指向同一个内存位置

要使其正常工作,您需要在
列表中分配(并小心地释放)所有插槽

List[index] = strdup(membername);
为了更好地尽早捕获错误,首先将
列表设置为所有空指针

for (int i=0; i<10; i++) List[i] = NULL;
这样,如果您没有足够小心地管理插槽,您将得到很好、很严重的错误:-)

您可能(没有足够的上下文)没有正确分配字符串

string List[10];
仅分配10个
字符串的数组,即10个
字符*
,即10个字符指针。它不为字符串本身分配任何存储

因此,如果上面的
membername
是一个全局
char*
,您要将数据从网络复制到其中,那么
列表中的所有插槽都将指向同一个内存位置

要使其正常工作,您需要在
列表中分配(并小心地释放)所有插槽

List[index] = strdup(membername);
为了更好地尽早捕获错误,首先将
列表设置为所有空指针

for (int i=0; i<10; i++) List[i] = NULL;

这样,如果您没有足够小心地管理插槽,您会遇到漂亮、严重的segfaults:-)

您是指自动扩展的数组吗?听起来/看起来您的代码中有bug。typedef只是一个类型的别名,它不会解决设计问题。List是一个指针数组,您可能会用错误的类型覆盖它?为什么要使用旧名称s被覆盖?您是否忘记递增索引?如何设置
列表[0]
?和
列表[4]
?显示一些相关代码!@user629034-收到的每个新字符串都会作为ar中的新元素追加