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

C++凯撒轮加密代码无法显示重音及非ASCII字符求助

凯撒加密程序修复方案(支持带重音字符)

问题分析

你的代码存在几个核心问题导致无法正确处理带重音的非ASCII字符,同时还有功能缺陷:

  • wcin >> message 只能读取单个空格分隔的单词,输入带空格的消息会被截断
  • 凯撒加密逻辑仅简单对字符码值做加法,未处理字母范围的循环(比如带重音的字母偏移后超出有效字符范围)
  • 重复调用 setlocale(LC_ALL, "") 属于冗余操作
  • 未初始化随机种子,导致每次运行的加密偏移量固定
  • 未区分字母与非字母字符,所有字符都会被偏移(比如空格、标点也会被修改)

修复后的完整代码

#include <iostream>
#include <locale>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;

void demanderMessage(wstring &message);
void encrypterLeMessage(wstring& message);

int main()
{
    setlocale(LC_ALL, "");
    srand(time(nullptr)); // 初始化随机种子
    wstring messageACrypter;
    demanderMessage(messageACrypter);
    encrypterLeMessage(messageACrypter);
    return 0;
}

void demanderMessage(wstring &message)
{
    wcout << L"Quel est le message que vous voulez encrypter via le système de la roue de César ?" << endl;
    wcin.ignore(); // 忽略输入缓冲区残留的换行符
    getline(wcin, message); // 读取整行输入(包含空格)
}

void encrypterLeMessage(wstring &message)
{
    int decalage = rand() % 26 + 1; // 生成1-26的随机偏移量
    wstring messageCode;

    for (wchar_t c : message) // 范围for循环遍历字符,避免依赖'\0'终止符
    {
        // 处理小写法语字母(含重音)
        if (c >= L'à' && c <= L'ÿ')
        {
            wchar_t base = L'à';
            int pos = c - base;
            pos = (pos + decalage) % 26; // 循环偏移实现凯撒轮逻辑
            messageCode += base + pos;
        }
        // 处理大写法语字母(含重音)
        else if (c >= L'À' && c <= L'Ÿ')
        {
            wchar_t base = L'À';
            int pos = c - base;
            pos = (pos + decalage) % 26;
            messageCode += base + pos;
        }
        // 非字母字符保持原样
        else
        {
            messageCode += c;
        }
    }

    wcout << L"Voici le message encrypté (décalage : " << decalage << L") :" << endl;
    wcout << messageCode << endl;
}

关键修复点说明

  1. 读取完整消息:

    • 用 getline(wcin, message) 替代 wcin >> message,支持读取包含空格的整行输入
    • 调用 wcin.ignore() 清除输入缓冲区的换行符,避免getline直接读取空行
  2. 带重音字母的循环偏移:

    • 针对法语小写(à到ÿ)和大写(À到Ÿ)字母范围,计算字符在字母表中的相对位置,通过取模26实现循环偏移(比如ÿ偏移1后回到à)
    • 非字母字符(空格、标点等)保持原样,符合凯撒加密的常规规则
  3. 随机偏移量初始化:

    • 添加 srand(time(nullptr)),让每次运行的偏移量随机化,避免rand()生成固定序列
  4. 代码优化:

    • 使用范围for循环遍历wstring,比基于'\0'的索引遍历更安全(wstring不一定以'\0'结尾)
    • 移除冗余的setlocale调用,main中设置一次即可适配终端编码
    • 修正了拼写错误(如systeme改为système)

测试注意事项

  • 确保VSCode的Windows终端编码与程序locale匹配(setlocale(LC_ALL, "")会自动适配系统当前编码)
  • 输入带重音的字符时,直接用法语输入法输入即可,程序会正确处理偏移

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:23:09