gpt4 book ai didi

凯撒密码在数组中越界

转载 作者:行者123 更新时间:2023-11-30 20:02:24 26 4
gpt4 key购买 nike

伙计们,我在某个网站上发现了这个凯撒密码代码......但是当我运行它时,它在在线编译器中显示段错误......但是在c编译器中我正在使用它显示处理器错误......任何人都可以吗?指出这段代码的错误

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define caesar(x) rot(13, x)
#define decaesar(x) rot(13, x)
#define decrypt_rot(x, y) rot((26-x), y)

void rot(int c, char *str)
{
int l = strlen(str);
const char *alpha[2] = { "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"};

int i;
for (i = 0; i < l; i++)
{
if (!isalpha(str[i]))
continue;

str[i] = alpha[isupper(str[i])][((int)(tolower(str[i])-'a')+c)%26];
}
}

int main()
{
char str[] = "This is a top secret text message!";

printf("Original: %s\n", str);
caesar(str);
printf("Encrypted: %s\n", str);
decaesar(str);
printf("Decrypted: %s\n", str);

return 0;
}

最佳答案

除了一个细节之外,您的代码是正确的,这可能会让新手感到困惑。

可以假设函数 isupper() 返回 bool 值 1 或 0,但是如果您检查文档,它会说一个不同于零的值(即 true)如果 c 确实是一个大写字母。否则为零(即假)。这个问题以及 isupper() 返回 int 而不是 _Bool 的事实导致了问题。

int isupper ( int c );

当返回 true 时,isupper() 可能会返回任何非零值。就我而言,它返回 8 (一个特定的位字段)。可能和你的一样。

您所要做的就是将 isupper() 的返回值转换为 _Bool

printf("%d   %d" ,(_Bool)isupper('A') , ((int)(tolower(str[i])-'a')+c)%26 ) ;

关于凯撒密码在数组中越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17400975/

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