for (int j=0;j<i;j++) { cipherText[j]=plainText[j]; if (plainText[j]!=' ') { cipherText[j]=cipherText[j]+key; } if (cipherText[j]>'Z') { cipherText[j]=cipherText[j]-'Z'+'A'-1;
时间: 2024-03-07 07:53:33 浏览: 65
这段代码是一个加密算法,将明文字符串 `plainText` 加密成密文字符串 `cipherText`。具体的加密过程如下:
1. 使用 `for` 循环遍历明文字符串 `plainText` 中的每一个字符,循环次数为字符串的长度 `i`。
2. 将明文字符复制到密文字符数组 `cipherText` 中。
3. 如果明文字符不是空格,则将其 ASCII 码值加上密钥 `key`。这里假设密钥是一个整数类型的变量。
4. 如果加密后的字符的 ASCII 码值大于字符 'Z' 的 ASCII 码值(即超出了大写字母表的范围),则将其减去 'Z' 的 ASCII 码值,再加上 'A' 的 ASCII 码值,减去 1,以实现循环加密的效果。
需要注意的是,这个加密算法只能处理大写字母,并且密钥是一个整数类型的变量。在实际应用中,需要根据具体需求进行修改。
相关问题
#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;
}
```
#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; }这个代码哪里有问题
这个代码的问题是,加密后的密文没有以'\0'结尾。在函数`caesarEncrypt`中,需要在加密完最后一个字符后,给`cipherText`数组最后一个元素赋值为'\0',表示字符串的结束。修改后的代码如下:
```c++
#include <iostream>
using namespace std;
#define STR_LEN 80
void caesarEncrypt(char plainText[], char cipherText[], int key) {
int i = 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';
}
}
cipherText[i] = '\0'; // 添加这一行,表示字符串的结束
}
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;
}
```
阅读全文