gpt4 book ai didi

c - cs50 Segfau 中的维吉尼亚密码

转载 作者:行者123 更新时间:2023-11-30 16:48:57 25 4
gpt4 key购买 nike

我不是经验丰富的编码员。请不要判断不好的样式。我遇到了 vingenere 密码的问题它一直给我 segfau

#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>**

int main(int argc,string argv[])
{
while (argc!=2)
{
printf("Incorrect input\n");
return 1;
}

printf("plaintext:");
string plaintext=get_string();

string num=argv[1];
int keylength=strlen(num);

for (int j=0, n=strlen(plaintext); j<n; j++)
{
char letter=plaintext[j];
if (isalpha(letter))
{

这就是 Segmantation Failure 错误的原因。如果我不检查 num 是大写还是小写,代码运行正常。

if (isupper(letter))
{
if (isupper(num))
{
printf ("%c",((((letter-65)+(num[j%keylength]-65))%26)+65));
}
else
{
printf ("%c",((((letter-65)+(num[j%keylength]-97))%26)+65));
}
}
else
{
if (isupper(num))
{
printf ("%c",((((letter-97)+(num[j%keylength]-65))%26)+97));
}

else
{
printf ("%c",((((letter-97)+(num[j%keylength]-97))%26)+97));
}
}
}
else
{
printf ("%c",letter);
}
    }
printf("\n");
return 0;
}

最佳答案

很可能,你的意思是

if (isupper(num[j % keylength))

将字符串(实际上是 char *)传递给 isupper() 是一个未定义的操作,并且可能会产生奇怪的效果,具体取决于 isupper() 已实现。 GNU 实现 ---

#define __ctype_lookup(__c) ((__ctype_ptr__+sizeof(""[__c]))[(int)(__c)])
#define isupper(__c) ((__ctype_lookup(__c)&(_U|_L))==_U)

--- 使用一个查找表,其中包含各种有趣的指针数学和底层转换,因此它可能允许传递 char * 而不会引起编译器的提示,但它绝对不会发生才能产生好的结果。更改您的 if 语句,它应该会工作得更好。

关于c - cs50 Segfau 中的维吉尼亚密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42776406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com