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

CS50 Pset2凯撒密码程序输出冗余字符问题求助

凯撒密码密文末尾出现多余字符的解决方法

问题原因

C语言中字符串必须以'\0'(空字符)作为结束标记。你的代码里定义密文数组时:

char cipher[len];

仅分配了与明文长度相同的空间,没有预留存储终止符的位置。printf输出字符串时会一直读取直到遇到'\0',因此会超出数组范围读取到内存中的随机值,也就是你看到的多余'V'。

修复步骤

  1. 调整数组长度:定义密文数组时,长度设为len + 1,预留终止符的位置:
    char cipher[len + 1];
    
  2. 添加终止符:在循环完成后,给数组最后一位赋值'\0':
    for (int i = 0; i < len; i++)
    {
        char new = rotate(plain_text[i], key);
        cipher[i] = new;
    }
    cipher[len] = '\0'; // 添加这一行
    

额外优化建议

你的rotate函数里用了ASCII硬编码值(比如97、122),可以改用字符常量让代码更易读,同时简化循环逻辑:

char rotate(char c, int n)
{
    if (islower(c))
    {
        return 'a' + (c - 'a' + n) % 26;
    }
    else if (isupper(c))
    {
        return 'A' + (c - 'A' + n) % 26;
    }
    else
    {
        return c;
    }
}

这种方式不需要判断是否超出范围,模运算会自动处理循环的情况,逻辑更简洁。

内容的提问来源于stack exchange,提问作者Maverick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:24:21