C 如何修复从';z';回到';a';用我的维格纳密码

C 如何修复从';z';回到';a';用我的维格纳密码,c,cs50,vigenere,C,Cs50,Vigenere,我的维格纳密码有问题。当我输入消息时,结果很好,但如果字母超过“z”,它不会循环回“a”,而是打印出其他ascii字符。此外,当我把信息放进去时,我有时会得到比我需要的更多的字符。键是hello,消息是mmmmm(我知道,不是很多消息,但它是一个示例),输出是tqxx{。请帮助 #include<cs50.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<c

我的维格纳密码有问题。当我输入消息时,结果很好,但如果字母超过“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;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*k;
如果(argc!=2)
{
printf(“给出一个参数,不是2个,不是3个,不是4个,以及除一个以外的任何其他金额”);
printf(“\n”);
返回1;
}
k=argv[1];
printf(“消息是什么?”);
字符串消息=获取字符串();
if(strlen(k)=“A”和消息[i]90)
{
x=x-26;
消息[i]=(字符)x;
}
printf(“%c”,消息[i]);
}
if(消息[i]>='a'和消息[i]'z')| |(消息[i]>'z'和消息[i]<'a'))
{
printf(“%c”,消息[i]);
}
}
printf(“\n”);
返回0;
}

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

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

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


最后一件事,您可能应该在
l
到达
k
末尾时再次将其设置为零,以防消息比键长。

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