如何简化C++凯撒加密代码的For循环?实现无数组替代方案
无数组实现凯撒加密的C++代码改写
原代码依赖数组存储整段消息,并用字符串终止符'\0'判断循环结束,如果你还没接触这类用法,可以改成逐个读取字符、实时加密输出的方式,完全不需要数组。
核心思路
不再一次性读取整段消息存入数组,而是逐个读取每个字符:
- 读取加密密钥后,跳过输入缓冲区残留的换行符(避免第一个读取的字符是换行)
- 用循环逐个读取字符,直到遇到换行(表示输入结束)
- 对每个字符执行原代码的加密逻辑,处理后直接输出,无需存储
改写后的完整代码
#include <iostream> using namespace std; int main() { char ch; int key; cout << "Enter a message to encrypt: "; cout << "Enter key: "; cin >> key; // 跳过cin>>key后留在缓冲区的换行符,避免影响后续字符读取 cin.ignore(); cout << "Encrypted message: "; // 逐个读取字符,直到遇到换行符 while (cin.get(ch) && ch != '\n') { if (ch >= 'a' && ch <= 'z') { ch = ch + key; if (ch > 'z') { ch = ch - 'z' + 'a' - 1; } } else if (ch >= 'A' && ch <= 'Z') { ch = ch + key; if (ch > 'Z') { ch = ch - 'Z' + 'A' - 1; } } // 处理完直接输出当前字符 cout << ch; } cout << endl; return 0; }
关键改动说明
- 移除了
message数组,全程用单个char变量ch处理字符 - 循环从基于数组终止符的
for循环,改为基于字符读取的while循环,逻辑更直观:只要读取到的字符不是换行,就继续处理 - 加密逻辑完全复用原代码的逻辑,保证加密效果一致
- 添加
cin.ignore()是因为cin >> key会把输入密钥后的换行符留在缓冲区,直接读取字符的话会先读到这个换行,导致循环直接结束,必须跳过
内容的提问来源于stack exchange,提问作者user20374141
相关产品推荐
相关产品推荐

