#include <iostream> using namespace std; #define STR_LEN 80 //③按密钥进行恺撒加密 void caesarEncrypt(char plainText[], char cipherText[], int key) { /********* Begin *********/ int i = 0; // 逐个判断字符数组的某一位是否是'\0',该字符意味着字符串的结束 while(plainText[i] != '\0') { i++; } for(int j=0; j<i; j++) { cipherText[j]=plainText[j]; } for(int j=0 ; j<i; j++) { if (cipherText[j]!=' ') { cipherText[j]=((cipherText[j]+key-'A')%26)+'A'; } } /********* End *********/ } int main() { char plainText[STR_LEN]; //存储明文 char cipherText[STR_LEN]; //存储密文 int key; //存储密钥 //①输入明文 cin.getline(plainText, STR_LEN); //②输入密钥 cin >> key; //③按密钥进行恺撒加密 caesarEncrypt(plainText, cipherText, key); //④输出密文 cout << cipherText << endl; return 0; }
时间: 2023-12-06 10:44:10 浏览: 61
该段代码实现了一个简单的恺撒加密程序,读取用户输入的明文和密钥,然后对明文进行加密,最后输出密文。具体实现过程如下:
1. 定义常量 STR_LEN 为 80,用于定义数组长度。
2. 定义函数 caesarEncrypt,用于实现恺撒加密。该函数接收三个参数:明文数组 plainText、密文数组 cipherText 和密钥 key。
3. 在函数中,先通过 while 循环逐个判断字符数组 plainText 的某一位是否是'\0',该字符意味着字符串的结束,记录字符串长度 i。
4. 接下来,将明文数组 plainText 中的每个字符赋值给密文数组 cipherText。
5. 最后,对密文数组 cipherText 进行加密。如果该字符不是空格,则将其 ASCII 码值加上密钥 key,再减去 'A' 的 ASCII 码值,将结果对 26 取模,最后再加上 'A' 的 ASCII 码值,即可得到加密后的字符。
6. 在主函数中,先定义明文数组 plainText、密文数组 cipherText 和密钥 key。
7. 通过 cin.getline() 函数读取用户输入的明文,并通过 cin 函数读取密钥。
8. 调用函数 caesarEncrypt 对明文进行加密,将加密后的结果保存在密文数组 cipherText 中。
9. 最后,通过 cout 输出密文。
相关问题
要求在题干所给代码框架的基础上,完成恺撒加密的第三个步骤,通过编写函数caesarEncrypt,实现按照加密规则完成加密。 例如:明文是"ATTACK IN THE MORNING",密钥k为3,加密后密文为"DWWDFN LQ WKH PRUQLQJ"。 注意:字符串中可以包含空格。#include <iostream> using namespace std; #define STR_LEN 80 //③按密钥进行恺撒加密 void caesarEncrypt(char plainText[], char cipherText[], int key) { /********* Begin *********/ /********* End *********/ } int main() { char plainText[STR_LEN]; //存储明文 char cipherText[STR_LEN]; //存储密文 int key; //存储密钥 //①输入明文 cin.getline(plainText, STR_LEN); //②输入密钥 cin >> key; //③按密钥进行恺撒加密 caesarEncrypt(plainText, cipherText, key); //④输出密文 cout << cipherText << endl; return 0; }
根据您的要求,我可以在题干所给的代码框架中,完成凯撒加密的第三个步骤,即按照加密规则完成加密,代码如下:
```
//③按密钥进行恺撒加密
void caesarEncrypt(char plainText[], char cipherText[], int key) {
int i = 0;
while (plainText[i] != '\0') {
if (plainText[i] >= 'A' && plainText[i] <= 'Z') {
cipherText[i] = (plainText[i] - 'A' + key) % 26 + 'A';
} else if (plainText[i] >= 'a' && plainText[i] <= 'z') {
cipherText[i] = (plainText[i] - 'a' + key) % 26 + 'a';
} else {
cipherText[i] = plainText[i];
}
i++;
}
cipherText[i] = '\0';
}
```
在这个函数中,我们首先遍历明文中的每个字符。如果该字符是大写字母,则按照加密规则将其转换为对应的密文字符。如果该字符是小写字母,则也按照加密规则将其转换为对应的密文字符。如果该字符不是字母,则直接将其添加到结果字符串中。最后,将结果字符串的末尾添加一个空字符,以表示字符串的结束。
您可以将这个函数添加到您的代码中,替换掉题干中给出的函数框架中的相应部分,即可完成凯撒加密的第三个步骤。
#include <iostream> using namespace std; #define STR_LEN 80 #define MAX_LINE 20 //读入一行,长度不超过maxLength void readLine(char str[], int maxLength) { int i = 0; while (i < maxLength) { char ch = cin.get(); if (ch != '\n') { str[i] = ch; } else { break; } i++; } str[i] = '\0'; } void caesarEncrypt(char plainText[][STR_LEN + 1], char cipherText[][STR_LEN + 1], int key) { int a = 0; while (cipherText[a][0] != '#') { a = a + 1; } for (int j = 0; j < a; j++) { int i = 0; while (cipherText[j][i] != '\0') { if (isalpha(cipherText[j][i])) { plainText[j][i] = ((cipherText[j][i] + key - 'A') % 26) + 'A'; } else { plainText[j][i] = cipherText[j][i]; } i++; } } } int main() { char cipherText[MAX_LINE][STR_LEN + 1]; //存储密文 char plainText[MAX_LINE][STR_LEN + 1]; int key; //输入明文 readLine(cipherText[0], STR_LEN); //输入密钥 cin >> key; //按密钥进行恺撒加密 caesarEncrypt(plainText, cipherText, key); //输出密文 for (int i = 0; i < MAX_LINE; i++) { for(int j=0 ; j<STR_LEN; j++) { if (plainText[i][0] == '\0') { break; } cout << plainText[j][i]; } } return 0; }这个代码哪里有问题
这份代码有几个问题:
1.在`caesarEncrypt`函数中,应该将密文的内容赋给明文而不是将明文的内容赋给密文。
2.在输出密文时,应该按照行列的顺序输出,而不是按列行的顺序输出。
3.在输出密文时,应该判断明文是否为空,如果为空就跳出循环,否则会输出一些奇怪的字符。
下面是修改后的代码:
```C++
#include <iostream>
using namespace std;
#define STR_LEN 80
#define MAX_LINE 20
//读入一行,长度不超过maxLength
void readLine(char str[], int maxLength) {
int i = 0;
while (i < maxLength) {
char ch = cin.get();
if (ch != '\n') {
str[i] = ch;
} else {
break;
}
i++;
}
str[i] = '\0';
}
void caesarEncrypt(char plainText[][STR_LEN + 1], char cipherText[][STR_LEN + 1], int key) {
int a = 0;
while (cipherText[a][0] != '#') {
a = a + 1;
}
for (int j = 0; j < a; j++) {
int i = 0;
while (cipherText[j][i] != '\0') {
if (isalpha(cipherText[j][i])) {
plainText[j][i] = ((cipherText[j][i] - 'A' + key) % 26) + 'A';
} else {
plainText[j][i] = cipherText[j][i];
}
i++;
}
plainText[j][i] = '\0';
}
}
int main() {
char cipherText[MAX_LINE][STR_LEN + 1]; //存储密文
char plainText[MAX_LINE][STR_LEN + 1];
int key;
//输入密文
for (int i = 0; i < MAX_LINE; i++) {
readLine(cipherText[i], STR_LEN);
if (cipherText[i][0] == '#') {
break;
}
}
//输入密钥
cin >> key;
//按密钥进行恺撒加密
caesarEncrypt(plainText, cipherText, key);
//输出密文
for (int i = 0; i < MAX_LINE; i++) {
if (plainText[i][0] == '\0') {
break;
}
for (int j = 0; plainText[i][j] != '\0'; j++) {
cout << plainText[i][j];
}
cout << endl;
}
return 0;
}
```
阅读全文