作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的维吉尼亚密码有问题。当我输入消息时,结果很好,但如果字母超过“z”,它不会循环回“a”,而是打印出其他 ascii 字符。此外,当我输入消息时,有时会得到比我需要的更多的字符。例如:键是 hello,消息是 mmmmm(我知道,消息不多,但它是一个示例),输出是 tqxx{{.请帮忙!!!!
#include<cs50.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int main( int argc, char *argv[])
{
char *k;
if (argc!=2)
{
printf("Give one argument, not 2, not 3, not 4 , and not any other amount other than one");
printf("\n");
return 1;
}
k = argv[1];
printf("What is the message? ");
string message = get_string();
if (strlen(k)<strlen(message))
{
printf("Invalid response\n");
return 0;
}
for (int i = 0, l = 0; i < strlen(message); i++, l++)
{
int x;
if (message[i]>='A' && message[i] <='Z')
{
message[i] = message[i]-'A';
message[i] = message[i] + (k[l] - 'A') % 26;
message[i] = message[i] + 'A';
message[i] = (char) x;
if (x > 90)
{
x = x - 26;
message[i] = (char) x;
}
printf("%c", message[i]);
}
if(message[i] >='a' && message[i] <= 'z')
{
message[i]= message[i]-'a';
message[i] = message[i] + (k[l] - 'a') % 26;
message[i] = message[i] + 'a';
printf("%c", message[i]);
}
if ((message[i] < 'A') || (message[i] > 'z') || (message[i] > 'Z' && message[i] < 'a'))
{
printf("%c", message[i]);
}
}
printf("\n");
return 0;
}
最佳答案
您应该将 message[i] + (k[l] - 'a')
放在括号内部分。模数仅适用于第二部分 - (k[l] - 'a')
- 当您希望它应用于整个表达式时。
此外,您假设 k[l]
与 message[i]
的情况相同(大写/小写),但这不一定是真的。您应该在每个内部分支中有另一个条件,或者(最好)计算 k
的数值的字母并将其存储为 0-25 范围内的数字。
三、为什么是x
那里?它在未初始化时使用,通常我看不出它存在的理由。
最后一件事,你可能应该设置 l
当到达 k
末尾时再次归零,以防消息比 key 长。
关于c - 如何修复维吉尼亚密码中从 'z' 回到 'a' 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44890032/
我是一名优秀的程序员,十分优秀!