以下是我尝试删除字符串中重复字符的C代码,但它运行不正常,卡在卡住时卡住了。请帮我理解我做错了什么?
void removeDupliacte(char *str)
{
int bitset=0;
int value= 0;
char *tail = str;
char temp;
int i=0;
while(*str)
{
value = *str - 'a';
if(bitset & (1 << value) > 0 )
{
str++;
}
else
{
bitset |= 1 << value;
temp = *str;
tail[i] =temp; /*stuck*/
i++;
str++;
}
}
tail[i++] = '\0';
}
int main()
{
char *str = "abac";
removeDupliacte(str);
printf("%s",str);
return 0;
}
答案 0 :(得分:3)
str是一个const字符串,意思是存储在一个你无法修改的区域(char *str = "abac";
)tail
指向str
,你也不能编辑它tail[i] =temp;
是试图写入只读区域。
一种解决方案是将str
的声明更改为char str[] = "abac";
,它将分配一个大小为“abac \ 0”的数组,并将字符串“abac \ 0”复制到它。由于数组位于读写内存中(如果是函数中的数组 - 在堆栈中),您将能够修改字符串。与char *str = "abac";
一致,它将字符串放在只读内存中,并将指向字符串的指针分配给str
。
答案 1 :(得分:1)
此外,您应该尝试将if语句更改为:
if( (bitset & (1 << value)) > 0 )
否则,由于运算符优先级,它没有做它应该做的事情。