使用位操作检测字符串重复字符的程序无输出问题排查
问题排查与修复
你的代码核心问题是运算符优先级错误,直接导致分支逻辑完全偏离预期:
在判断条件if (x & H > 0)中,C语言里关系运算符>的优先级高于按位与&,实际执行的是x & (H > 0),这和你想要的“判断x与H的按位与结果是否非零”逻辑完全不符。
另外还有一个次要问题:你定义的字符串"finiding\0"多写了一个i,正确的"finding"应该是6个字符加终止符,不过这不是无输出的核心原因。
修复后的代码如下:
#include <stdio.h> int main() { char A[] = "finding"; // 修正拼写错误,字符串常量自动带终止符,无需手动加\0 long int H = 0; long int x = 0; for (int i = 0; A[i] != '\0'; i++) { x = 1; int temp = A[i]; // 增加小写字母判断,避免非字母字符导致移位越界 if (temp < 'a' || temp > 'z') { continue; } x = x << (temp - 97); if ((x & H) > 0) { // 给按位与结果加括号,修正优先级问题 printf(" %c duplicate found !", A[i]); } else { H = x | H; } } return 0; }
修复点说明:
- 修正字符串拼写错误,移除手动添加的
\0(字符串常量会自动追加终止符) - 给
x & H添加括号,确保先执行按位与操作,再判断结果是否大于0 - 增加小写字母范围判断,避免非小写字母导致的移位越界(比如大写字母或符号会让
temp-97成为负数或过大数值,移位行为未定义)
运行修复后的代码,输入"finding"会输出i duplicate found !和 n duplicate found !,符合预期。
内容的提问来源于stack exchange,提问作者Ashwin Gorle
相关产品推荐
相关产品推荐

