【问题标题】:How do I fix the looping from 'z' back to 'a' in my Vigenere Cipher如何在我的 Vigenere Cipher 中修复从“z”到“a”的循环
【发布时间】: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;
}

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 为方便起见minimal reproducible example
  • 我认为最简单的方法是将当前字母转换为字母表中的索引(a 为 0,z 为 25;对于 A..Z 类似),转换关键字母到字母表的索引,将两个索引以字母表的大小为模相加(给出的结果是在 0..25 范围内的字母表索引),并将索引转换回适当的字母(添加索引到'a''A')。由于您通常会多次处理密钥,因此您可以考虑将其预处理为索引值,这样您就不会针对每个字符执行此操作。还可以考虑编写函数——微小的内联函数。
  • 我敢打赌,您会在页面 RHS 上列出的 10 个“相关”问题中的任何一个中找到问题的答案。甚至还有一个在标题中提到了“额外字符”。

标签: c cs50 vigenere


【解决方案1】:

您应该在message[i] + (k[l] - 'a') 部分周围加上括号。模仅适用于第二部分 - (k[l] - 'a') - 而您希望它适用于整个表达式。

另外,您假设k[l]message[i] 大小写相同(大写/小写),但这不一定是正确的。您应该在每个内部分支中都有另一个条件,或者(最好)计算k 的字母的数值并将它们存储为0-25 范围内的数字。

第三,为什么x在那里?它在未初始化时使用,通常我看不出它存在的原因。

最后一件事,你应该在l 到达k 的末尾时再次将其设置为零,以防消息比密钥长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2014-02-20
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多