使用缓冲区删除字符串中的重复项

  • 本文关键字:字符串 缓冲区 删除 c
  • 更新时间 :
  • 英文 :


我正在尝试使用映射删除字符串中的重复项。通过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]);
}
}
}

最新更新