在C中的字符串数组的成员之间交换

时间:2015-04-24 21:40:42

标签: c arrays string

我想删除一个字符串数组的第i个成员,并将之后的每个成员带到一个位置(第i + 1个成员到i,依此类推)。我想出了以下代码:

    for (int j = i; j < arrSize - 1; j++) {
        strcpy(members[j],members[j+1]);
    }
    free(members[arrSize-1]);

但这让我觉得它可能是错的。例如,如果第i个地方成员包含名称&#34; John&#34;,而第(i + 1)个地方成员包含名称&#34; Joshua&#34;,这意味着每个字符串是在不同的长度,会有任何内存泄漏或任何问题?提前谢谢!

编辑:成员的定义:

members = malloc(maxMembersNum * sizeof(char*));

3 个答案:

答案 0 :(得分:1)

为什么不移动指针,而不是复制字符串的内容?那就是:

for (int j = i; j < arrSize - 1; j++) {
    char *temp = members[j];
    members[j] = members[j+1];
    members[j+1] = temp;
}
free(members[arrSize-1]);

答案 1 :(得分:1)

正如评论所说,成员的定义决定了功能的结果。

如果是:

char* members[];

然后它是一个指针数组,使用strcpy将覆盖内存,除非所有这些缓冲区都被分配并且大小相同,否则最终会崩溃。在这种情况下,您只需使用

复制指针即可
members[j] = members[j+1]

如果是:

std::string members[];

然后你可以将它视为普通数组并省去strcpy和free(只需使用=)。

如果是:

char成员[80] [80]; //固定大小的预分配缓冲区

那么你的代码就可以了,但是免费的不会。

答案 2 :(得分:-1)

如果lines和arrSize是一个你可以作为一个单元传入的结构的成员,但是没有这个会更简单:

void remove_by_index(char **lines, int line, int *arrSize) {
    if (line >= *arrSize) return;
    *arrSize -= 1;

    if (lines[line]) free(lines[line]);
    memmove(lines + line, lines + line + 1, ((*arrSize - line) * sizeof(char *)));
    lines[*arrSize] = NULL;
}

严格来说,arrSize必须更改以反映删除,否则删除的单元格必须标记为NULL,但不必像我在此处所做的那样同时执行这两项操作(尽管它& #39;这不是一个坏主意。)

另请注意,如果数组的两个成员指向同一个字符串,这将失败,这里的其他答案也是如此 - 因为您需要更复杂的数据结构。