凯撒密码加密代码运行无输出,请求技术协助
排查凯撒密码代码输出空白的问题
嘿,我帮你仔细看了下这段C代码,输出空白的问题主要是几个关键错误导致的,咱们一步步来修正:
核心错误分析
- 未初始化的循环变量误用:你用
y作为循环的计数器(for (y=0;y<strlen(text);y++)),但循环体里却一直在用未赋值的i访问text[i]——i的值是随机的,大概率指向的不是你输入的字符串内容,自然取不到有效的字母字符,也就不会进入输出分支。 - 逻辑错误的字符判断条件:你的判断语句
text[i]>='a'&&text[i]<='z'&&text[i]>='A'&&text[i]<='Z'完全不成立,一个字符不可能同时既是小写字母又是大写字母!这里应该用**逻辑或(||)**把两个范围分开,改成(text[y]>='a'&&text[y]<='z') || (text[y]>='A'&&text[y]<='Z')。 - 输出了原字符而非加密结果:你计算了加密后的
c,但输出的却是原始的text[i],而且还加了\n换行,就算条件成立,也只会输出原字符,不是加密后的内容。 - 变量重复定义:你在
main开头已经定义了int c,循环里又重新定义了int c=(int)text[i]+x;,这会导致编译错误(C89标准下)或者隐藏外层变量,干扰逻辑。 - 未处理字母溢出:凯撒密码需要处理移位后超出字母范围的情况,比如
z加2应该变成b,而不是ASCII码里的{,这部分你完全没做,会导致非字母的奇怪字符输出。 - 不安全的
gets函数:gets已经被C标准废弃了,容易导致缓冲区溢出,建议换成fgets来读取输入。
修正后的完整代码
#include <stdio.h> #include <string.h> int main() { int key, i; char text[20]; printf("Enter the plaintext: "); // 用fgets替代gets,同时去掉末尾的换行符 fgets(text, sizeof(text), stdin); text[strcspn(text, "\n")] = '\0'; // 移除fgets读取的换行符 printf("Enter the key: "); scanf("%d", &key); // 先计算一次字符串长度,避免循环里重复计算 int len = strlen(text); for (i = 0; i < len; i++) { // 判断是否为小写字母 if (text[i] >= 'a' && text[i] <= 'z') { // 处理溢出:减去'a'得到0-25的范围,加key后取模26,再加回'a' char encrypted = (text[i] - 'a' + key) % 26 + 'a'; printf("%c", encrypted); } // 判断是否为大写字母 else if (text[i] >= 'A' && text[i] <= 'Z') { char encrypted = (text[i] - 'A' + key) % 26 + 'A'; printf("%c", encrypted); } // 非字母字符直接输出(可选,根据需求调整) else { printf("%c", text[i]); } } printf("\n"); // 最后换行 return 0; }
代码修改说明
- 替换
gets为fgets,并处理了fgets会读取换行符的问题,确保字符串正确。 - 修正了循环变量的使用,统一用
i作为计数器,避免未初始化变量的问题。 - 拆分了字母判断条件,用
if-else if分别处理小写和大写字母,逻辑更清晰。 - 增加了溢出处理:通过将字母转换为0-25的范围,取模26来实现循环移位,保证加密后仍然是字母。
- 输出加密后的字符,而非原字符,并且去掉了多余的换行,让输出是完整的加密字符串。
- 增加了非字母字符的处理(直接输出),你可以根据需求调整这部分逻辑。
内容的提问来源于stack exchange,提问作者Gagan Batra
相关产品推荐
相关产品推荐

