如何在C语言中实现将字母替换为预定义5位数字的加密程序?
实现字母转预定义5位数字的C语言加密程序
嘿,我来帮你搞定这个学校项目的加密程序!你的需求其实很清晰——把文本里的每个字母替换成预设的5位数字,核心就是字符映射+文件逐字符处理,我一步步给你拆解:
1. 先搞定核心:字母-数字映射表
因为我们要处理a-z(如果需要兼容大写也可以扩展),可以用一个字符串数组来存每个字母对应的5位数字,索引直接对应字母的ASCII偏移量。比如:
// 索引0对应'a',1对应'b',以此类推,按你的需求填数字 char *char_to_num[] = { "12345", // a "54321", // b // ... 这里把c到o的数字补上 "69865", // p // ... 补上q到k的数字 "31238", // l // ... 补上m到n的数字 "43297" // e };
这样,当你拿到一个小写字母c时,直接用char_to_num[c - 'a']就能拿到对应的5位数字串,非常方便。
2. 修正你的文件读取逻辑
你现在用while(!feof(eFile))是个常见误区——feof()是在读取失败后才会返回真,所以会导致最后多读一次无效字符。正确的写法应该是在循环条件里直接判断读取是否成功:
FILE *eFile = fopen("Message.txt", "r"); // 只读模式就够了,不用ab+ if (!eFile) { // 一定要判断文件是否打开成功 printf("无法打开文件!\n"); return 1; } char message; // 用fgetc逐字符读取,直到文件结束 while ((message = fgetc(eFile)) != EOF) { // 这里处理每个字符 } fclose(eFile);
3. 完整的加密逻辑实现
接下来把映射和读取结合起来,还可以把加密后的内容写入新文件,比如Encrypted.txt:
#include <stdio.h> #include <ctype.h> // 用于tolower()处理大写字母 int main() { // 定义字母到5位数字的映射表,按你的需求补充完整所有26个字母 char *char_to_num[] = { "12345", // a "54321", // b "11111", // c "22222", // d "43297", // e "33333", // f "44444", // g "55555", // h "66666", // i "77777", // j "31238", // l "88888", // m "99999", // n "69865", // p // 请补充q-r、s-t、u-v、w-x、y-z对应的数字 }; // 打开原始文件和加密文件 FILE *input_file = fopen("Message.txt", "r"); FILE *output_file = fopen("Encrypted.txt", "w"); if (!input_file || !output_file) { printf("文件打开失败!\n"); return 1; } char c; while ((c = fgetc(input_file)) != EOF) { // 先把大写字母转成小写,兼容大小写输入 char lower_c = tolower(c); // 判断是否是小写字母 if (lower_c >= 'a' && lower_c <= 'z') { // 找到对应的数字串,写入输出文件,后面加空格 fprintf(output_file, "%s ", char_to_num[lower_c - 'a']); } else { // 非字母字符可以选择直接输出,或者忽略,这里直接输出原字符 fprintf(output_file, "%c", c); } } // 别忘了关闭文件,避免资源泄漏 fclose(input_file); fclose(output_file); printf("加密完成!结果已保存到Encrypted.txt\n"); return 0; }
4. 关键细节说明
- 大小写兼容:用
tolower()把大写字母转成小写,这样不管输入是Apple还是APPLE,都能正确映射。 - 文件操作安全:每次打开文件都要判断是否成功,避免程序崩溃。
- 非字母处理:如果遇到空格、标点等非字母字符,代码里直接输出原字符,你可以根据需求修改(比如忽略或者替换成其他标记)。
- 映射表补充:记得把
char_to_num数组里的26个字母对应的数字都补全,不然处理到未定义的字母会出问题。
当你在Message.txt里写入apple后,运行程序,Encrypted.txt里就会出现你想要的12345 69865 69865 31238 43297 (最后有个小空格,要是在意的话,可以加个判断处理最后一个字符的空格,学校项目里这个小细节通常不影响)。
内容的提问来源于stack exchange,提问作者Sepsi Zoltán
相关产品推荐
相关产品推荐

