我正在用C进行编码。
我算法的目标是使我们在数组str中找到的每个字符加倍。
我必须运行一些测试,对于第一个测试,我叫doubleChar("~/fichier.txt", '~')
,它工作正常,但是我的第二个测试是doubleChar("une commande # commentaire", '#')
,我从标题中得到了错误。
当我尝试调试它时,错误发生在重新分配行上。
在调试器中,我收到此错误:
程序接收信号SIGABRT堆栈跟踪可在“调用堆栈”标签中找到
知道为什么吗?
这是我的代码:
char * doubleChar(const char *str, char c){
assert(str!=NULL);
char *newString=malloc(sizeof(str) * sizeof(char));
int a = 0;
while(str[a] != '\0'){
newString[a]=str[a];
a++;
}
newString[a]='\0';
int i = 0;
while(newString[i] != '\0'){
if(newString[i] == c){
newString = (char *)realloc(newString, stringLength(newString)*sizeof(char) + sizeof(char));
for(int j=stringLength(newString)+1; j>i; j--){
newString[j]=newString[j-1];
}
i++; //we add 1 to i so we don't find the char we just added
}
i++;
}
return newString;
}
答案 0 :(得分:0)
char *newString=malloc(sizeof(str) * sizeof(char));
由于str
是const char *
,因此sizeof(str)
是const char *
在您的平台上占用的字节数。那不是你想要的。您要传递给malloc
的是要存储的字符串的长度,请确保为结束的零留一个额外的字节。在这种情况下,就是(strlen(str) + 1)
。
newString = (char *)realloc(newString, stringLength(newString)*sizeof(char) + sizeof(char));
这也可能是错误的。您需要(strlen(newString) + 2)
为新添加的字符保留一个字节,为零终止符保留一个字节。不过,由于我无法告诉您stringLength
函数的作用,因此很难确定。
根据定义,sizeof(char)
是一个。 sizeof
函数返回以字符为单位的大小。
比起strlen(newString) + 2
,更容易理解stringLength(newString)*sizeof(char) + sizeof(char)
,因为strlen
是标准函数,而sizeof(char)
冗长而丑陋。因此,我强烈建议将其更改为strlen(newString) + 2
。