c - 在 C 中向字符串添加零

标签 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 的空闲 block 内的 0 字节

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

最佳答案

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

您的函数应该返回 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,因此不需要乘以它。

关于c - 在 C 中向字符串添加零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41659759/

相关文章:

c - 数组指针的地址,&array

C ,没有换行符的换行符?

c - 如何在 C 中的 for (;;) 循环中声明多个变量?

java - 如何计算字符串数组中超过一定字符数的字符串数量。 java

c - 单独使用时难以理解 c 指针

c - 在 C 中打印时间 (0) 的格式说明符

c++ - 如何在 varC++ 中将 int 与字符串组合

python - TypeError : float() argument must be a string or a number, 不是 'NoneType'

c - 这里是否需要将指针设置为 NULL 并清空 char 数组?

c++ - 超出范围时是否删除了指向堆栈对象的指针?