我正在尝试使用映射删除字符串中的重复项。通过GDB运行它,我无法弄清楚代码在哪里失败,尽管逻辑对我来说似乎是正确的。有人能指出错误吗?
int main() {
char *str="I had my morning tea";
int len = strlen(str);
int dupArr[256] = {0};
//Build the map
int i=0;
for(i;i<256;i++)
dupArr[str[i]]++;
//If the count is 1 then print that value.
i=0;
for(i;i<256;i++) {
if(dupArr[str[i]] == 1) {
printf("%cn",str[i]);
}
}
}
输出
I h y o r i g t % c 4 @ } ` 8 � F J
我爬到"t",这是正确的,但后来我看到了魔法字符。
您的字符串长度为len
,但您正在遍历till 256
,即out of bound.
Use len
。
int i=0;
for(i;i<LEN;i++)
dupArr[str[i]]++;
此外,如果你正在检查重复项,那么它应该是bigger than 1
,因为你是++
,第一次遇到字符
if(dupArr[str[i]] > 1)
除了Mark Ezberg的好答案之外,请注意dupArr[str[i]]++;
在str[i] < 0
时也会带来问题。
最好将字符视为unsigned char
:
int dupArr[UCHAR_MAX + 1] = {0};
....
dupArr[(unsigned char) str[i]]++;
将这个和其他想法结合在一起:
int main(void) {
char *str="I had my morning tea";
size_t dupArr[UCHAR_MAX + 1] = {0};
unsigned char *s = (unsigned char *) str;
while (*s) {
dupArr[*s]++;
s++;
}
for(unsigned i = 0; i <= UCHAR_MAX; i++) {
// A duplicate is when dupArr[i] is _more_ than 1.
if(dupArr[i] > 1) {
printf("%cn",str[i]);
}
}
}