return 在 for 循环中使用 strcat 生成的 char 数组的 C 函数

C function to return a char array generated with strcat in a for loop

我试图在 char 数组中添加 10 个包含单词 "data" 的字符串,结果是 return。这是我的代码:

    #include <stdio.h>
    #include <string.h>

    char* concat () {
       char src[50], dest[1];
       strcpy(src,  "data");

       int i =0;
       for (i=0; i<=10; i++) {
          strcat(dest, src);
          strcat(dest, ",");
       }
       return(dest);
    }

    int main () {
        printf("Final destination string : |%s|", concat());
        return 0;
    }

但是当我 return 我的 dest 字符数组时,我遇到了分段错误。

您错误地认为 strcat 在连接字符串时分配内存。 错了。因此,通过在 strcat 中使用长度为 1 的字符数组,您调用了未定义的行为,因为它将写入超出单个元素 char 数组范围的内存。

还有 dest 变量具有自动存储持续时间 - 一旦声明它的范围结束(在这种情况下是函数结束时),您就不能使用它。在变量的生命周期结束后使用变量是未定义的行为。

另一件事是 strcat 的第一个参数是 null 终止的 char 数组,这里不是这种情况,因此使用错误的参数给 strcat 也是未定义的行为。

前提是 dest 可以包含您正在使用此函数的任何串联字符串,您可以执行此操作

char s[]="data";
char* dest = malloc(MAXLEN);
if(!dest){ perror("malloc"); exit(EXIT_FAILURE);}
for(int i = 0; i <10; i++){
   if(!i) strcpy(dest,src);
   else
     strcat(dest,src);
   strcat(dest,",");
}
return dest;

main()中:

char *s;
printf("Final destination string : |%s|", (s=concat()));
free(s);

我不能 return 我的目标字符数组,我有分段错误 => 因为 dest 是只有一个字符的数组,你不能' t store 将 "data" 存储 10 次为 dest。而不是 dest[1] ,将 dest 作为 char pointer 并动态分配内存。

你可能想像下面那样做

#include <stdio.h>
#include <string.h>
char* concat () {
        char src[50], *dest;
        dest = malloc(100 * sizeof(char)); /* allocating 100 bytes for dest, allocate according to your requirement */
        strcpy(src,  "data");

        int i =0,j;
        for (i=0,j=0; i<=10; i++) {
                strcat(dest+j, src);//first time dest points to starting address
                strcat(dest, ",");
                j = strlen(dest);/* next time put data at dest+j location */
        }
        dest[j]= '[=10=]';
        return dest ;
}
int main () {
        char * ret = NULL;
        printf("Final destination string : |%s|\n", ret = concat());
        free(ret); /* to avoid memory leakage */
        return 0;
}

希望对您有所帮助。