CS50 Pset2凯撒密码程序输出冗余字符问题求助
凯撒密码密文末尾出现多余字符的解决方法
问题原因
C语言中字符串必须以'\0'(空字符)作为结束标记。你的代码里定义密文数组时:
char cipher[len];
仅分配了与明文长度相同的空间,没有预留存储终止符的位置。printf输出字符串时会一直读取直到遇到'\0',因此会超出数组范围读取到内存中的随机值,也就是你看到的多余'V'。
修复步骤
- 调整数组长度:定义密文数组时,长度设为
len + 1,预留终止符的位置:char cipher[len + 1]; - 添加终止符:在循环完成后,给数组最后一位赋值
'\0':for (int i = 0; i < len; i++) { char new = rotate(plain_text[i], key); cipher[i] = new; } cipher[len] = '\0'; // 添加这一行
额外优化建议
你的rotate函数里用了ASCII硬编码值(比如97、122),可以改用字符常量让代码更易读,同时简化循环逻辑:
char rotate(char c, int n) { if (islower(c)) { return 'a' + (c - 'a' + n) % 26; } else if (isupper(c)) { return 'A' + (c - 'A' + n) % 26; } else { return c; } }
这种方式不需要判断是否超出范围,模运算会自动处理循环的情况,逻辑更简洁。
内容的提问来源于stack exchange,提问作者Maverick
相关产品推荐
相关产品推荐

