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; }
关键修复点说明
读取完整消息:
- 用
getline(wcin, message)替代wcin >> message,支持读取包含空格的整行输入 - 调用
wcin.ignore()清除输入缓冲区的换行符,避免getline直接读取空行
- 用
带重音字母的循环偏移:
- 针对法语小写(
à到ÿ)和大写(À到Ÿ)字母范围,计算字符在字母表中的相对位置,通过取模26实现循环偏移(比如ÿ偏移1后回到à) - 非字母字符(空格、标点等)保持原样,符合凯撒加密的常规规则
- 针对法语小写(
随机偏移量初始化:
- 添加
srand(time(nullptr)),让每次运行的偏移量随机化,避免rand()生成固定序列
- 添加
代码优化:
- 使用范围for循环遍历
wstring,比基于'\0'的索引遍历更安全(wstring不一定以'\0'结尾) - 移除冗余的
setlocale调用,main中设置一次即可适配终端编码 - 修正了拼写错误(如
systeme改为système)
- 使用范围for循环遍历
测试注意事项
- 确保VSCode的Windows终端编码与程序locale匹配(
setlocale(LC_ALL, "")会自动适配系统当前编码) - 输入带重音的字符时,直接用法语输入法输入即可,程序会正确处理偏移
内容的提问来源于stack exchange,提问作者Etienne
相关产品推荐
相关产品推荐

