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 pointe
r 并动态分配内存。
你可能想像下面那样做
#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;
}
希望对您有所帮助。
我试图在 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 pointe
r 并动态分配内存。
你可能想像下面那样做
#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;
}
希望对您有所帮助。