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("%c\n",str[i]);
}
}
}
输出
I h y o r i g t % c 4 @ } ` 8 � F J
我起身't',这是正确的,但后来我看到了魔法字符。
解决方案
除了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]);
}
}
}
推荐阅读
- javascript - Facebook SDK 未加载
- php - 简单的 WP 插件抛出意想不到的结局
- python - 在 asana API 中使用 Python 更新 custom_fields
- c++ - c ++在线程中执行系统函数
- jasper-reports - JasperReport - 按状态汇总值而不对记录进行分组
- wordpress - Wordpress get_posts 总是返回 null,对于任何帖子类型,post_status=all 等
- kubernetes - 当 Kubernetes 中有 pod 安全策略时如何部署 statefulset
- javascript - 我可以通过 JS 将 ACF 转发器字段插入 MaxMegaMenu 吗?
- python - 在 Python 中打印 HTML 输出
- c# - 在计算距离并检查更近的位置后,如何访问纬度和经度?