C++字符串元素与整数比较出错:如何统计字符串中0、1字符数量
问题根源与解决办法
嘿,这个问题其实是字符与整数的ASCII值混淆导致的,我来给你拆解清楚:
为什么你的代码不对?
你定义的liczba是string类型,它的每个元素都是char类型的字符。当你写liczba[i] == 0时,你是在拿字符的ASCII编码值和整数0比较——但字符'0'的ASCII码是48,'1'是49,和整数0、1完全不相等,自然统计不到任何结果。
哪怕你把整数0转成char,得到的是ASCII码为0的空字符(不是字符'0'),所以还是匹配不上。
两种可行的解决方法
方法1:直接和字符字面量比较
把比较的目标换成字符形式的'0'和'1',这才是字符串中存储的真实内容:
int zera = 0, jedynki = 0; for (int i = 0; i < liczba.length(); i++) { if (liczba[i] == '0') zera ++; else if (liczba[i] == '1') jedynki ++; }
方法2:把字符转换为对应整数
利用ASCII表中数字字符连续排列的特性,用字符减去'0'就能得到对应的整数值(比如'0' - '0' = 0,'1' - '0' = 1),再和整数比较:
int zera = 0, jedynki = 0; for (int i = 0; i < liczba.length(); i++) { int digit = liczba[i] - '0'; if (digit == 0) zera ++; else if (digit == 1) jedynki ++; }
这种方法的好处是,如果之后要处理其他数字(比如2-9),逻辑会更统一。
额外提醒
如果你的字符串里可能包含非数字字符,建议先做个合法性检查,比如用<cctype>头文件里的isdigit()函数:
#include <cctype> // ... int zera = 0, jedynki = 0; for (int i = 0; i < liczba.length(); i++) { if (isdigit(liczba[i])) { // 先判断是否是数字字符 int digit = liczba[i] - '0'; if (digit == 0) zera ++; else if (digit == 1) jedynki ++; } }
内容的提问来源于stack exchange,提问作者Karol
相关产品推荐
相关产品推荐

