You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未知密钥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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:27:02