CS50凯撒密码(caesar)check50单测未过,输出与预期一致报错咨询
问题定位
你的代码存在两处会导致check50校验失败的问题,其中核心问题是输出逻辑错误:
- 第一处:非字母字符的处理存在重复输出
当遍历到非字母字符时,你在if(!isalpha(text[b]))分支中已经直接打印了原字符,但是分支外还有一句无条件的printf("%c", cipher);。此时cipher的初始值为0,对应ASCII表中的空字符(不可见),相当于所有非字母字符后都多追加了一个不可见的空字符,肉眼查看输出完全一致,但check50的逐字节校验会判定输出不匹配。 - 第二处:输入提示不符合要求
CS50凯撒作业要求输入明文的提示语为严格的plaintext:,你的代码中写的是Plain text:,首字母大写且多了空格,也可能触发校验失败。
修复方案
调整非字母字符的处理逻辑,删除非字母分支中的单独打印,统一通过cipher变量输出所有字符即可,参考修改后的核心逻辑:
for (int b = 0, n = strlen(text); b < n; b++) { int k = 0; int cipher = 0; if(!isalpha(text[b])) { cipher = text[b]; } else if (islower(text[b])) { int t = text [b] - 'a'; k = (t + atoi(word[1])) % 26; cipher = k + 'a'; } else if (isupper(text[b])) { int t = text [b] - 'A'; k = (t + atoi(word[1])) % 26; cipher = k + 'A'; } // 统一输出,避免重复打印 printf("%c", cipher); }
同时把输入提示修改为string text = get_string("plaintext: ");即可通过校验。
内容的提问来源于stack exchange,提问作者user250888
相关产品推荐
相关产品推荐

