C语言:字符串指针上的字符串连接

时间:2014-01-09 09:38:31

标签: c

我有这个add_str函数的代码:

void    add_str(char *str1, char *str2, char **res)
{
  int   i;
  int   j = 0;

  res[0] = malloc((strlen(str1) + strlen(str2) + 1) * sizeof(char));
  if (res[0] == NULL)
    return;
  for (i = 0; str1[i]; i++)
    res[0][j++] = str1[i];
  for (i = 0; str2[i]; i++)
    res[0][j++] = str2[i];
  res[0][j] = '\0';
}

它接收2个字符串str1str2以及一个不是malloc的字符串**res。我的功能在** res。

上添加了str1str2

我的问题是:每次我必须用它做某事时,有没有办法不写res[0]

5 个答案:

答案 0 :(得分:6)

res是指向指针的指针,因此在使用它之前需要取消引用它。你是对的res[0]不是在这种情况下做到这一点的正确方法。请改用(*res)

答案 1 :(得分:3)

你真正想要的是取消引用:

*res

答案 2 :(得分:2)

为什么还需要传递指针指针?您也可以将其更改为:

char *add_str(char *str1, char *str2)
{
    char *res = malloc((strlen(str1) + strlen(str2) + 1));
    if (res == NULL)
        return NULL;

    char *ret = res;

    while(*str1 != 0)
        *res++ = *str1++;

    while(*str2 != 0)
        *res++ = *str2++;

    *res = '\0';
    return ret;
}

它具有相同的效果,你不必处理这个丑陋的构造。

答案 3 :(得分:1)

这不是您问题的直接答案,而是更多的一般编码建议:

为了正确管理程序中的所有动态内存操作,您应该努力(尽可能多地尝试)从同一个函数执行操作x=malloc(...)free(x)

在大多数情况下,如果您正确设计代码,那么您可以实现此目的。

在某些情况下,当流程是异步的时,就不可能这样做。例如,一个函数分配缓冲区,在系统中发生某些事件后,另一个函数(AKA回调)释放缓冲区。

在这种情况下,您仍应尝试将两个操作都放在同一“范围”(类,文件或模块)中。

在您的编码示例中,函数add_str分配缓冲区但不释放缓冲区,这意味着其他一些函数最终必须执行它(或者您将有内存泄漏)。因此,如果可能,那么您应该尝试在此函数之外执行malloc

答案 4 :(得分:0)

我会使用另一个指针变量来保存结果字符串,这样可以避免始终取消引用结果变量。当然,除此之外,您应该避免使用数组下标运算符,其中使用简单的指针解引用。我还对您的示例代码进行了一些其他更改,以使其更简洁,随意忽略它们。

void add_str(char *str1, char *str2, char **res) {
    char* result = *res = malloc((strlen(str1) + strlen(str2) + 1) * sizeof(char));
    //Dereferencing a NULL pointer will safely crash your program on any sane system.
    //if (!result) return;
    int   j = 0;    //Since C99 you are allowed to mix code and variable declarations.
    for(int i = 0; str1[i]; i++) result[j++] = str1[i];
    for(int i = 0; str2[i]; i++) result[j++] = str2[i];
    result[j] = '\0';
}

如果指针充分发挥作用,您的代码可能如下所示:

void add_str(char *str1, char *str2, char **res) {
    char* result = *res = malloc((strlen(str1) + strlen(str2) + 1) * sizeof(char));
    while(*str1) *result++ = *str1++;
    while(*str2) *result++ = *str2++;
    *result = '\0';
}