我在C中编写一个函数,它接受两个相同长度的字符串,
例如: -
S1 ="你好"和S2 =" 12345"
并返回一个结果,混合输入字符串中的字符,以便结果字符串中的第一个字符是来自S1的第一个字符,第二个字符是来自S2的第一个字符,r中的第三个字符是第二个字符来自S1和r中的第四个字符是来自S2的第二个字符,依此类推......
所以如果: -
S1 = "Hello"
S2 = "12345"
Result = "H1e2l3l4o5"
我的功能如下:
#include <stdio.h>
#include <string.h>
char* mix(char *s1, char *s2)
{
int length = strlen(s1);
char* result = malloc(sizeof(char) * length * 2);
int i, j;
for(i = 0, j = 0; i < (length); i++, j = j + 2)
{
result[j] = s1[i];
result[j + 1] = s2[i];
}
return result;
}
对于上面的S1和S2的值,它产生:
`H1e2l3l4o5:=C:\Uºt6▄╘º`
这使我感到困惑,因为我没有分配&#34;结果&#34;对于许多字符有足够的记忆,并且没有警告过分段错误或任何这种性质。我明显做错了吗?
答案 0 :(得分:5)
这是因为您没有在结果中以空值终止字符串。添加此行以解决此问题:
result[j] = '\0';
您需要解决的另一个问题是为null终止符分配空间:
char* result = malloc(length * 2 + 1);
C标准要求sizeof(char)
为1
,因此无需乘以它。
最后,您需要确保s2
有足够的长度可以复制到结果中,即strlen(s2) >= strlen(1)
。
答案 1 :(得分:0)
您没有为终止C字符串所需的null character分配内存,当然,您没有将其放在字符串之后。这就是代码从内存中打印垃圾直到它到达第一个空字符的原因。
char* mix(char *s1, char *s2)
{
int length = strlen(s1);
char* result = malloc(sizeof(char) * (length * 2 + 1));
int i, j;
for(i = 0, j = 0; i < length; i ++, j = j + 2)
{
result[j] = s1[i];
result[j + 1] = s2[i];
}
// Put the null character to end the the string
result[j] = 0;
return result;
}
显然代码也应该检查s2
的长度,但偶然地,这不是必需的。
如果s1
长于s2
,则在循环期间复制s2
的空终止字符,结果字符串的长度为2*strlen(s2)
。如果s2
超过s1
,则代码仅复制其第一个length
个字符。