字符转整数后算术运算失效问题排查求助
问题分析:字母偏移循环逻辑失效的原因与修复方案
我来帮你拆解下遇到的问题——你当前的代码不仅循环计算逻辑有缺陷,还有可能存在执行条件未触发的隐藏问题,咱们一步步梳理:
一、核心逻辑错误:循环计算方式不对
你现在用97 + (ascii - 122)来处理超出'z'的情况,这个公式只适用于偏移量刚好让ASCII超过122一次的场景(比如偏移25),而且计算结果本身就不对:
比如你例子里的r(114)+25=139,按你的公式得到97+(139-122)=114,也就是回到了r,但正确结果应该是q(113)——因为r往后移25位,等价于往前移1位。
正确的做法是先把字母转换为0-25的索引(相对于'a'),加上偏移量后对26取模,再转回到ASCII:
// 替换你当前的小写字母处理分支 else if (plaintext[i] >= 'a' && plaintext[i] <= 'z') { int originalIndex = plaintext[i] - 'a'; int offset = addIndex(lowerCaseKeyword[i % keywordLength]); int newIndex = (originalIndex + offset) % 26; // 如果是减法偏移可以加这个判断,加法场景其实不需要,但能让代码更健壮 if (newIndex < 0) { newIndex += 26; } cipher[i] = 'a' + newIndex; }
这种方式不管偏移量多大,都能正确循环,还省去了判断是否超出范围的步骤,逻辑更简洁可靠。
二、为什么你的现有代码没执行预期分支?
你说实际运行时直接把139存入了cipher[2],说明if (ascii > 'z')这个条件根本没触发,可能的原因有这几个:
addIndex返回值不符合预期:如果lowerCaseKeyword里的字符不是小写'z'(比如是大写Z),你的addIndex函数里的abc是小写字符串,找不到匹配会返回0,导致ascii=114+0=114,不满足> 'z'的条件,直接走else分支。可以在addIndex里加个调试输出,看看返回值是不是25。- 变量
ascii被其他分支干扰:你在处理大写字母的if分支里,是不是也使用了ascii变量?如果在那里给ascii赋了值,会影响到else if分支的计算。建议把ascii的定义放到else if分支内部,缩小作用域:else if (plaintext[i] >= 'a' && plaintext[i] <= 'z') { int ascii = plaintext[i] + addIndex(lowerCaseKeyword[i % keywordLength]); // 后续判断逻辑... } - 有符号char的类型问题:有些编译器中
char是有符号类型,当ascii超过127时会被转成负数,这时候ascii > 'z'('z'是122)就变成了负数>122,条件为假。可以直接用整数122代替'z'做比较:if (ascii > 122) { cipher[i] = 97 + (ascii - 122); }
额外的优化小建议
- 你的
addIndex函数可以直接简化,不需要遍历字符串:return character - 'a';——小写字母的话,'a'-'a'=0,'z'-'a'=25,完全符合需求,还避免了找不到返回0的隐患。 - 注意
cipher数组的长度要定义为plaintextLength + 1,最后记得加字符串终止符cipher[plaintextLength] = '\0';,否则后续输出会出现乱码。
内容的提问来源于stack exchange,提问作者he1zn0erg
相关产品推荐
相关产品推荐

