gpt4 book ai didi

c - C语言凯撒密码程序的高级思考

转载 作者:行者123 更新时间:2023-11-30 18:41:06 25 4
gpt4 key购买 nike

#include <stdio.h>

void caesar (char cipher[], int shift);

int main ()
{

char cipher[200];
int shift;

printf("Enter text to be encrypted (in small letter): ");
gets(cipher);

printf("Number of shift to right? : ");
scanf("%d", &shift);

caesar (cipher, shift);

return 0;
}

void caesar (char cipher[], int shift)
{
int i = 0;

while (cipher[i] != '\0')
{
if ((cipher[i] + shift) >= 97 && (cipher[i] + shift) <= 122)
{
cipher[i] += (shift);
}
else
{
cipher[i] += (shift - 25);
}
i++;
}
printf("%s", cipher);
}

如何忽略空格操作?我的意思是,我想在转换/解密的字符串中添加空格。当我运行这个程序时,它会消失加密字符串中的空格。我怎样才能做到这一点?假设“这是一支笔”右移 1 就会变成:“uijt jt b qfo”。

最佳答案

移位前应检查字符是否为字母。您的代码会改变所有内容,然后仅检查字符是否是有效字母以检测换行。 (它也不会使标点符号和空格消失,而是将它们转换为 ASCII 值低于 32 的不可打印字符。)

您还可以使用模运算符强制正确换行:

void caesar(char cipher[], int shift)
{
char *p = cipher;

while (*p)
{
if ('a' <= *p && *p <= 'z') {
*p = 'a' + (*p - 'a' + shift) % 26;
}
p++;
}
}

如果您想自动检测类次,只需对所有 26 个可能的类次使用暴力,并检查常见的预期子字符串:

int autocaesar(char cipher[])
{
int shift = 0;

while (shift < 26) {
if (strstr(cipher, "the")) return shift;
if (strstr(cipher, "this")) return shift;
if (strstr(cipher, "that")) return shift;

caesar(cipher, 1);
shift++;
}

return -1;
}

函数strstr位于<string.h>并在字符串中查找子字符串。这里做得非常粗略:没有强制 "the"是一个独立的词。此外,检查区分大小写。

请注意,密码一次移动一个字符,因为原始字符串将连续移动。如果没有找到任何内容,它将被包装以包含原始字符串。

关于c - C语言凯撒密码程序的高级思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23349763/

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