c - 用 C 语言编写维吉尼亚密码(保留空格)

标签 c cs50 vigenere

我正在尝试编写一个保留空格的维吉尼亚密码(c 语言)。因此,如果我收到一条简单的消息“你好,你好吗”,密码将采用这种形式“abcde fgh ijk lmn”,我想要的就是保留空格。我已经为此工作了一段时间。任何帮助,将不胜感激。

这是我的代码

void CipherText(char* plainText, char* cipherKey)
{
    int keyLength = strlen(cipherKey);
    char cipherText;

    for(int i = 0; i < strlen(plainText); i++)
    {

        int cipherText = (unsigned char)plainText[i];

        cipherText = ((int)plainText[i]-97+(int)tolower(cipherKey[i])-97)%26 + 'A';

        putchar(cipherText);
    }
    putchar('\n');
}

最佳答案

在尝试转换(编码)字符之前测试该字符是否是字母。另外,不要使用数字作为字符代码 - 例如,使用 'a' 而不是 97。我删除了一些不必要的类型转换。我还使用 cipherText 而不是 (int)plainText[i],因为这样可以避免不需要的符号扩展。我还添加了一些空格;明智地使用空格会更容易阅读代码。

void CipherText(char* plainText, char* cipherKey)
{
    int keyLength = strlen(cipherKey);
    char cipherText;

    for(int i = 0; i < strlen(plainText); i++)
    {
        int cipherText = (unsigned char)plainText[i];
        if (isalpha(cipherText))
            cipherText = (cipherText - 'a' + tolower(cipherKey[i]) - 'a') % 26 + 'A';
        putchar(cipherText);
    }
    putchar('\n');
}

关于c - 用 C 语言编写维吉尼亚密码(保留空格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59958767/

相关文章:

c - 字符串中的大写字符无法转换为小写字符,并且减去它们的 ASCII 值不会使它们出现在字母索引中

c - 我不知道为什么会收到段错误错误

C中的密文,如何重复关键字符

c - 输出正确,但在 c 中显示运行时错误

c - 亚表达蛋白的亚表达和分组

c - 在 C 中,如何从字符串中取出两个字符,并将它们分配为自己的字符串?

c - 关于 CS50 pset2 vigenere

有人能告诉我这段 C 代码在做什么吗?

c - 将结构 vector 传递给函数

c - 如何让控制台不断提示用户输入,直到用户在 C 中输入正整数?