在 C 中向字符串添加零
Add zeros to String in C
我想用这个方法在字符串前面加零:
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 个字节 free'd
我认为问题出在 realloc 上,但我不知道为什么它在这里不起作用
通过调用 realloc
,您(可能)在函数内部修改 str
,但是 addFrontzeros
的调用者看不到 str
的新值.它仍然有旧版本的 str
,不再指向 realloc
之后的有效数据。
你的函数应该return str
(这样它可以被称为x = addFrontzeros(x, n)
)或者接受一个char **
这样它就可以修改指针。
正如 StoryTeller 所指出的,str = realloc(str, ...)
在 realloc
失败的情况下是不安全的。首先,因为您没有测试是否 realloc
returned NULL
,其次,因为如果它 does return 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,因此不需要乘以它。
我想用这个方法在字符串前面加零:
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 个字节 free'd
我认为问题出在 realloc 上,但我不知道为什么它在这里不起作用
通过调用 realloc
,您(可能)在函数内部修改 str
,但是 addFrontzeros
的调用者看不到 str
的新值.它仍然有旧版本的 str
,不再指向 realloc
之后的有效数据。
你的函数应该return str
(这样它可以被称为x = addFrontzeros(x, n)
)或者接受一个char **
这样它就可以修改指针。
正如 StoryTeller 所指出的,str = realloc(str, ...)
在 realloc
失败的情况下是不安全的。首先,因为您没有测试是否 realloc
returned NULL
,其次,因为如果它 does return 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,因此不需要乘以它。