未知密钥Shift Cipher C语言解密程序输出末尾出现问号问题求解
移位密码程序输出末尾问号问题修复方案
核心问题原因
- 存储解密结果的
after数组每次填充完成后,未添加C语言字符串必须的结束标识'\0'。printf的%s格式符会持续读取内存直到遇到'\0',因此会读到数组后续的随机垃圾值,表现为输出末尾出现问号、乱码等异常。 - 数组遍历边界判断错误:
code和after数组长度均为400,合法下标范围是0~399,你代码中写的i <= 400会触发数组越界访问,导致未定义行为。
修复步骤
1. 修正数组遍历边界
将解密部分的内层循环条件
for (i = 0; (i <= 400 && code[i] != 0); i++)
修改为
for (i = 0; (i < 400 && code[i] != '\0'); i++)
2. 手动添加字符串结束符
在内层循环遍历结束后,立刻添加一行代码给after数组补结束符:
after[i] = '\0';
可选优化(不影响乱码问题,仅提升功能正确性)
- 你当前的解密逻辑使用的是
code[i] + x,若要得到标准的穷举解密结果,可改为减密钥的逻辑:if (code[i] - x < 97) { // 97对应ASCII的小写字母a after[i] = code[i] - x + 26; } else { after[i] = code[i] - x; } - 输入密文的
scanf写法可优化为scanf("%399[^\n]", code),去掉多余的s、限制输入长度避免数组溢出。
修复后解密部分完整代码
case 1: for (x = 1; x <= 25; x++) { for (i = 0; (i < 400 && code[i] != '\0'); i++) { if (code[i] == 32) { // 保留空格 after[i] = 32; continue; } // 若要使用标准解密逻辑,替换此处的加x逻辑即可 if (code[i] + x > 122) { // 122对应ASCII的小写字母z after[i] = (code[i] + x - 122) + 96; } else { after[i] = code[i] + x; } } after[i] = '\0'; // 补字符串结束符,解决末尾问号问题 printf("解密后结果:%s\n", after); printf("原始密文:%s\n", code); } break;
内容的提问来源于stack exchange,提问作者SirJames Longbottom
相关产品推荐
相关产品推荐

