伙计们,我在某个网站上发现了这个凯撒密码。...但是当我运行它时,它在在线编译器中显示段错误..但是在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()返回一个布尔值1或0,但是如果您查看文档,它会说A的值不同于零(即true),如果c实际上是一个大写字母。否则为零(即false)。
这和isupper()返回一个int而不是_Bool的事实引起了问题。

int isupper ( int c );

当返回true时,isupper()可能返回任何non_zero值。在我的情况下,它返回8(特定位字段)。大概在你的一样。

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

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

关于c - Cesar密码超出数组范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17400975/

10-09 08:42