#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 18:07:19 浏览: 111
在代码中,明文数组 `plaintext` 是用字符数组表示的。在 C 语言中,字符数组需要以空字符 `\0` 结尾才能被识别为字符串。在你的代码中,没有为明文数组 `plaintext` 的最后一个字符赋值为空字符 `\0`,导致程序无法正确识别明文数组 `plaintext` 为字符串,从而产生乱码。在 `VigenereDecode` 函数的最后加上以下代码即可解决问题:
```
plaintext[j] = '\0';
```
阅读全文