当前位置:  开发笔记 > 程序员 > 正文

在C中为字符串添加零

如何解决《在C中为字符串添加零》经验,为你挑选了1个好方法。

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

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

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

    int i=0;
    for(;i

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

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

使用valgrind我收到此错误:地址0x5201b00是一个大小为2的块内的0字节

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



1> hobbs..:

通过调用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,所以乘以它是不必要的.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有