返回的字符数多于使用malloc分配的字符数

时间:2017-10-31 10:22:10

标签: c string

我在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;对于许多字符有足够的记忆,并且没有警告过分段错误或任何这种性质。我明显做错了吗?

2 个答案:

答案 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个字符。