伙计们,我在某个网站上发现了这个凯撒密码。...但是当我运行它时,它在在线编译器中显示段错误..但是在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/