C++密码字符统计程序问题:spec变量错误将数字计入特殊字符
程序失效的核心原因
1. 内层循环终止条件完全错误
所有用于匹配字符类型的内层循环,终止条件都犯了根本性错误:
- 大写字母循环:
for (int j = 0; j<big_characters[j]; j++) - 小写字母循环:
for (int k = 0; k<small_characters[k]; k++) - 数字循环:
for (int l = 0; l<digits[l]; l++) - 特殊字符循环:
for (int q = 0; q<special_characters[q]; q++)
你把数组元素的ASCII值当成了循环的终止长度。比如big_characters[j]是大写字母,对应的ASCII值在65-90之间,这会导致循环执行几十次,远超过数组实际长度(26/10/32),甚至会越界访问数组,触发未定义行为。
正确的终止条件应该是数组的实际元素个数:
- 大写/小写字母循环:
j < 26 - 数字循环:
l < 10 - 特殊字符循环:
q < 32
2. 字符匹配逻辑无互斥,导致错误计数
当前代码中,一个字符会被依次检查大写、小写、数字、特殊字符四类,即使它已经被识别为某一类(比如数字),后面的特殊字符循环仍会继续执行。加上循环条件错误导致的匹配混乱,就会出现数字没被正确计入d,反而被错误匹配到特殊字符的情况。
比如数字字符在数字循环中,因为循环条件错误,可能没完成完整的10次匹配就提前退出,或者越界后意外匹配到特殊字符数组的内容,导致spec被错误累加。
3. 额外问题:匹配到目标字符后未终止循环
即使循环条件正确,当前代码在匹配到目标字符(比如找到大写字母)后,仍然会继续执行循环剩余的迭代,这会导致同一个字符被重复计数,同时输出大量无意义的false信息。
内容的提问来源于stack exchange,提问作者jjj
相关产品推荐
相关产品推荐

