在C中为字符串添加零

时间:2017-01-15 09:43:35

标签: c string pointers realloc

我想用这种方法在字符串前添加零:

void addFrontzeros(char *str,int zeros)
{
    if(zeros==0)
    {
        return;
    }

    char *temp=malloc((strlen(str)+1+zeros)*sizeof(char));

    int i=0;
    for(;i<zeros;i++)
    {
        temp[i]='0';
    }

    int j=0;
    for(;j<strlen(str);j++)
    {
        temp[j+zeros]=str[j];
    }
    temp[strlen(str)+zeros]=0;
    str=realloc(str,(strlen(temp)+1)*sizeof(char));
    strcpy(str,temp);
    free(temp);
}

但是当我从另一个方法调用它时,调用后字符串为空。 调用者字符串在另一种方法中分配如下:

char *mul = malloc(sizeof(char)*2);
    mul[0]='0';
    mul[1]=0;

使用valgrind我遇到了这个错误: 地址0x5201b00是大小为2的块内的0字节,并且

我认为问题出在realloc上,但我不知道为什么它不会在这里工作

1 个答案:

答案 0 :(得分:5)

通过调用realloc您可能(可能)在函数内部修改str,但addFrontzeros的调用者未看到str的新值。它仍然具有str的旧版本,在realloc之后不再指向有效数据。

您的函数应return str(以便可以将其称为x = addFrontzeros(x, n))或接受char **,以便它可以修改指针。

正如StoryTeller所指出的,str = realloc(str, ...)realloc失败的情况下是不安全的。首先,因为您没有测试realloc是否返回NULL,其次是因为如果 返回NULL,那么您的内存泄漏是因为旧的str仍然已分配,但您已失去指向它的指针。处理它的最小方法是

char *new_str = realloc(str, strlen(temp)+1);
if (!new_str) {
    perror("addFrontzeros: realloc");
} else {
    str = new_str;
}

虽然如果您想以其他方式处理失败,您可以,并且原始str仍然有效且未经修改。

另一个问题是您只复制strlen(str)字节,其中不包括终止零字节,因此您的字符串未正确终止。要么自己添加终止零,要么只是再复制一个字节(因为你可以假设str 正确终止,以便开始)。

最后,作为旁注,根据定义,sizeof(char)为1,因此乘以它是不必要的。