首页 > 解决方案 > 使用缓冲区删除字符串中的重复项

问题描述

我正在尝试使用地图删除字符串中的重复项。通过 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("%c\n",str[i]);
        }
    }
}

输出

I h y o r i g t % c 4  @ } ` 8 � F J

我起身't',这是正确的,但后来我看到了魔法字符。

标签: c

解决方案


除了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("%c\n",str[i]);
    }
  }
}

推荐阅读