C语言凯撒密码函数执行后字符数组仅部分内容显示问题排查
凯撒密码加密后仅显示部分内容的原因及修复
你的代码出现密文仅显示前几个字符的核心原因是空格处理逻辑错误,导致密文字符数组中第一个空格的位置被保留为初始的'\0',而printf("%s")遇到'\0'就会停止输出,后续内容自然无法显示。下面是具体问题和修复方案:
一、核心错误分析
1. 字符与字符串字面量的比较错误
代码中处理空格的部分:
else if (x[i]==" ") { y[i] = " "; }
" "是字符串字面量,本质是指向该字符串的指针;而x[i]是char类型的单个字符。用==比较时,是在比较指针地址和字符的ASCII值,永远不会相等,所以空格永远不会被正确处理。- 未被处理的空格位置,
y[i]保持初始化时的0(即'\0'),这是字符串的终止符,导致printf输出到这里就停止。
2. 其他次要bug(不影响内容显示,但影响加密正确性)
- 偏移量硬编码:
else分支中写死了z + 3,应该使用参数n,否则无论传入的n是多少,偏移量都是3。 - 边界判断错误:
if (z + n > al)中,al是sizeof(alph)/sizeof(alph[0]),结果是27(因为字符串包含末尾的'\0'),但实际有效字母只有26个,正确的边界应该是判断z + n >= strlen(alph)(即26)。 - 未手动添加字符串终止符:虽然
cdmsg初始化为全0,但如果明文长度刚好等于数组长度,密文末尾会缺少终止符,最好手动添加。
二、修复后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> char alph[] = "abcdefghijklmnopqrstuvwxyz"; int caesarcypher(char x[], char y[], int n) { printf("Original Message: %s\n", x); size_t al_len = strlen(alph); // 有效字母长度26 size_t msg_len = strlen(x); for (size_t i = 0; i < msg_len; i++) { // 标记当前字符是否已处理 int processed = 0; for (size_t z = 0; z < al_len; z++) { if (x[i] == alph[z]) { size_t new_pos = z + n; if (new_pos >= al_len) { new_pos -= al_len; } y[i] = alph[new_pos]; processed = 1; break; // 找到匹配后跳出内层循环,提升效率 } } // 处理空格(或其他非字母字符,这里仅处理空格) if (!processed && x[i] == ' ') { y[i] = ' '; } // 如果需要支持其他非字母字符,可在这里添加默认处理,比如直接复制 } // 手动添加字符串终止符 y[msg_len] = '\0'; printf("Coded Message: %s\n", y); return 0; } int main(void) { char ogmsg[100] = {0}; char cdmsg[100] = {0}; strcpy(ogmsg, "this is a secret message"); caesarcypher(ogmsg, cdmsg, 3); return EXIT_SUCCESS; }
三、修复后的执行结果
Original Message: this is a secret message Coded Message: wklv lv d vhfuhw phvvdjh
内容的提问来源于stack exchange,提问作者Jodlak
相关产品推荐
相关产品推荐

