#include<stdio.h> #define MAXLEN 100 void VigenereDecode(char* ciphertext, char *key, char* plaintext); int main() { char ciphertext[MAXLEN], key[MAXLEN]; char plaintext[MAXLEN]; //输入密文 scanf("%[^\n]",ciphertext); //因为密文中有可能有空格键,用scanf碰到空格键会默认结束输入,输入格式用%[^\n]则可以解决,其意思是碰到回车才结束输入 //输入密钥 scanf("%s",key); //进行密码破译 VigenereDecode(ciphertext,key,plaintext); printf("%s",plaintext); return 0; } void VigenereDecode(char* ciphertext, char *key, char* plaintext) { /*ciphertext-----密文数组 key------------密钥数组 plaintext------明文数组 */ // 请在此添加代码,实现维吉尼亚密码解密的步骤 /********** Begin *********/ //int i=0,j=strlen(key),k=strlen(ciphertext),n=0; int i=0,j=0,k=0,n=0; while(ciphertext[i]!='\0') { i++; k++; } i=0; while(key[i]!='\0') { i++; j++; } //printf("%d\n",k); for(i=0;i<k;i++) { if(ciphertext[i]!=' '&&ciphertext[i]>='a'&&ciphertext[i]<='z') { if(key[n%j]>='a'&&key[n%j]<='z') { plaintext[i]=(ciphertext[i]+26-(key[n%j]-'a')-'a')%26+'a'; } else if(key[n%j]>='A'&&key[n%j]<='Z') { plaintext[i]=(ciphertext[i]+26-(key[n%j]-'A')-'a')%26+'a'; } n++; } else if(ciphertext[i]!=' '&&ciphertext[i]>='A'&&ciphertext[i]<='Z') { if(key[n%j]>='a'&&key[n%j]<='z') { plaintext[i] = (ciphertext[i]+26-(key[n%j]-'a')-'A')%26+'A'; } else if(key[n%j]>='A'&&key[n%j]<='Z') { plaintext[i]=(ciphertext[i]+26-(key[n%j]-'A')-'A')%26+'A'; } n++; } else plaintext[i]=' '; } i=0;j=0; while((plaintext[i]>='a'&&plaintext[i]<='Z')||plaintext[i]==' ') { plaintext[j]=plaintext[i]; i++; j++; } /********** End **********/ } 这段代码运行后为什么会有乱码
时间: 2023-06-20 16:07:19 浏览: 114
在代码中,明文数组 `plaintext` 是用字符数组表示的。在 C 语言中,字符数组需要以空字符 `\0` 结尾才能被识别为字符串。在你的代码中,没有为明文数组 `plaintext` 的最后一个字符赋值为空字符 `\0`,导致程序无法正确识别明文数组 `plaintext` 为字符串,从而产生乱码。在 `VigenereDecode` 函数的最后加上以下代码即可解决问题:
```
plaintext[j] = '\0';
```
相关问题
#include<stdio.h>#include<stdlib.h>#include<string.h>
在C语言中,`#include<stdio.h>`、`#include<stdlib.h>`和`#include<string.h>`分别包含了输入/输出、内存管理以及字符串处理相关的库。这里给你演示如何使用这些头文件中的函数:
1. **输入/输出(stdio.h)**:
```c
#include<stdio.h>
int main() {
printf("Hello, World!\n"); // 使用printf输出字符串
scanf("%s", "Enter your name: "); // 使用scanf从用户那里读取输入
return 0;
}
```
2. **内存管理(stdlib.h)**:
```c
#include<stdlib.h>
int *createArray(int size) {
int *array = malloc(size * sizeof(int)); // 分配动态内存
return array;
}
void freeMemory(int *array, int size) {
free(array); // 释放已分配的内存
}
```
3. **字符串处理(string.h)**:
```c
#include<string.h>
char* copyString(const char* src) {
char* dest = (char*)malloc(strlen(src) + 1); // 动态分配内存复制字符串
strcpy(dest, src);
return dest;
}
```
注意,C语言的标准库函数可能需要链接到适当的库,如`-lstdc++` 或 `-lm`,具体取决于编译器设置。
#include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct LNode
#include <stdio.h> 和 #include <malloc.h> 是 C 语言中的头文件,前者用于输入输出,后者用于内存动态分配和释放。
typedef char ElemType; 定义了一个名为 ElemType 的数据类型,实际上是 char 类型。
typedef struct LNode 定义了一个名为 LNode 的结构体类型。
该结构体类型中可以包含多个成员变量,具体定义方式如下:
typedef struct LNode {
int data;
struct LNode* next;
} LNode;
这里定义了一个 LNode 结构体类型,其中包含两个成员变量:data 和 next。data 是一个整型变量,next 是一个指向 LNode 类型的指针变量。这种结构体类型通常用于链表的实现。
阅读全文