程序不能使用空格正确加密

时间:2015-11-21 20:51:12

标签: c encryption cryptography

我试图创建一个vigenere密码的实现,但是当在输入中给定空格时,程序形式的不正常工作遇到了障碍。 (假设关键字培根) 有空格

输入

  

见我

正确输出

  

Negh zf

实际输出

  

Negh Ne

没有空格

输入

  

我开会

输出继电器

  

Neghzf

很明显,程序正在为没有空格的字符串工作。这里的任何地方都是代码,并提前感谢您的帮助。

#include <string.h>
#include <stdio.h>
#include <ctype.h>
char encrypt(int key, char a);
int hash(char a);
int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("You need a keyword!");
        return 1;
    }

    string keyword = argv[1];

    for (int j = 0; j != strlen(keyword); ++j)
    {
        if (!isalpha(keyword[j]))
        {
            printf ("The keyword needs to be all words!");
            return 1;
        }
    }

    string text = GetString();

    for (int i = 0, j = 0; i != strlen(text); ++i, ++j)
    {
        if (j == strlen(keyword))
        {
            j = 0;
        }

        int key = 0;

        if (isupper(keyword[j]))
        {
            key = keyword[j] - 'A';
            text[i] = encrypt(key, text[i]);
        }
        else if (islower(keyword[j]))
        {
            key = keyword[j] - 'a';
            text[i] = encrypt(key, text[i]);
        }
        else if (isspace(text[i]))
        {
            j = j - 1;
        }

    }

    printf ("%s\n", text);
}
char encrypt(int key, char a)
{
    if (isalpha(a))
    {
        int total = (int) a + key;
        if (isupper(a))
        {
            while (total > 90)
            {
                total = total - 26;
            }
        }
        else if (islower(a))
        {
            while (total > 122)
            {
                total = total - 26;
            }
        }

        return (char) total;
    }
    else
    {
        return a;
    }
}

2 个答案:

答案 0 :(得分:1)

问题出在你的for循环中。尝试以下列方式纠正它(你会很容易理解错误):

for (int i = 0, j = 0; i != strlen(text); ++i, ++j)
{
    if (j == strlen(keyword))
    {
        j = 0;
    }
    // the following check mmust be done here
    if (isspace(text[i])) {
        j = j - 1;
    }
    int key = 0;
    if (isupper(keyword[j]))
    {
        key = keyword[j] - 'A';
        text[i] = encrypt(key, text[i]);
    }
    else if (islower(keyword[j]))
    {
        key = keyword[j] - 'a';
        text[i] = encrypt(key, text[i]);
    }
}

答案 1 :(得分:0)

看起来你正在从命令行参数中读取你的单词;但是,命令行参数通常由空格分隔。你的程序不知道那些空格应该是输入的一部分。

您需要更改阅读输入的方式。