我目前正在进行段错,我似乎无法弄清楚为什么...... 我正在制作一个连接字符串值的代码:
char* concat(char** strs, unsigned int nstrs)
{
char* newstring;
int length = 0;
int j;
int charcount;
int strcount;
int k = 0;
for (j = 0; j <= nstrs - 1; j++) {
length = sizeof(strs[j]) + length;
}
newstring = malloc(length);
for (strcount = 0; strcount <= nstrs - 1; strcount++) {
for (charcount = 0; charcount <= strlen(strs[strcount]) - 1; charcount++) {
newstring[k] = strs[charcount][strcount];
k++;
}
}
return newstring;
在我的主要功能中,我有......
char* introname[] = {"My", "name", "is", "Trill-o"};
printf("%s\n", concat(introname, 4));
答案 0 :(得分:2)
在您的代码中,您需要更改
sizeof(strs[j])
到
strlen(strs[j])
永远记住,sizeof
不是一个功能,它是一个操作员。它返回提供的数据类型的大小。在您的代码中,strs[j]
的类型为char *
,因此sizeof
将返回等于sizeof(char *)
的值。
要获取字符串的长度,您必须使用strlen()
。
那就是说,请注意,strlen()
不包括终止null的计数。因此,在length
中使用malloc()
时,您需要为一个字节添加空格,例如
newstring = malloc(length + 1); // 1 more byte for storing the terminating null.
此外,您必须检查malloc()
的返回值以确保成功。如果malloc()
失败,它将返回NULL
,后续使用newstring
将导致UB。
根据逻辑部分,您的代码应该是
newstring[k] = strs[strcount][charcount];
并正确终止字符串,
newstring[k] = '\0' ;
在for
循环之外。
答案 1 :(得分:1)
sizeof(strs[j])
函数中的将sizeof(pointer)
而不是sizeof(array)
但是因为你有一个字符串使用strlen(strs[j])
来获取字符串的长度。
请注意将内存分配给\0
字符。
答案 2 :(得分:1)
不要使用sizeof来获取字符串的长度。
你需要使用strlen。
sizeof(strs[j]) ; // bad, will return the sizeof pointer which is 4 or 8 depending on the system
strlen(strs[j]); // this is what you want.
答案 3 :(得分:0)
C字符串也是 null 终止的字符数组。确保连接的字符串末尾有\ 0。这是一个工作版本:string concatenation
注意我也切换了数组的索引。我想这就是你想要的。
newstring = malloc(length + 1); // for '\0' character
...
newstring[k] = strs[strcount][charcount];
...
newstring[length] = '\0' ;
答案 4 :(得分:0)
你的主要问题在于:
length = sizeof(strs[j]) + length;
sizeof
没有给出字符串所需的长度,因为它是char *
,而不是数组。你想要的是strlen(strs[j]))
。
此外,当您完成长度总计后,请在NUL
之前为终止malloc
添加一个。{/ p>
最后:
newstring[k] = strs[charcount][strcount];
应该是
newstring[k] = strs[strcount][charcount];