【发布时间】:2017-07-03 16:11:56
【问题描述】:
我的 Vigenere 密码有问题。当我输入我的信息时,结果很好,但如果字母超过“z”,它不会循环回到“a”,而是打印出其他 ascii 字符。此外,当我输入信息时,有时会得到比我需要的更多的字符。例如:key 是 hello,message 是 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;
}
【问题讨论】:
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
-
我认为最简单的方法是将当前字母转换为字母表中的索引(
a为 0,z为 25;对于 A..Z 类似),转换关键字母到字母表的索引,将两个索引以字母表的大小为模相加(给出的结果是在 0..25 范围内的字母表索引),并将索引转换回适当的字母(添加索引到'a'或'A')。由于您通常会多次处理密钥,因此您可以考虑将其预处理为索引值,这样您就不会针对每个字符执行此操作。还可以考虑编写函数——微小的内联函数。 -
我敢打赌,您会在页面 RHS 上列出的 10 个“相关”问题中的任何一个中找到问题的答案。甚至还有一个在标题中提到了“额外字符”。