1

我正在尝试用 C 制作一个简单的加密程序。我的目标是将abc(可以是任何单词)翻译成123. 然后乘以2获取246,然后再次转换为文本,然后在屏幕上书写bdf。这是我的算法无法正常工作。我进去abc了,我得到了cbc。你能帮助我吗?

int main()
{
    int z,o,c,l,i,j,k,*D;
    char word[10];
char alfabe[24]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z','\0'};

    printf("enter word");
    scanf("%s",word);

    c=strlen(word);
    printf("has %d letters ", c);
    D = (int *) malloc( sizeof(int)*c ); 
    for(i=0;i<c;i++) {
        for(j=0;j<26;j++) {
            if(word[i]==alfabe[j]) {  
                 D[i]=2*(j+1);
                 break;
            }
        }
    }
     printf("\nlast form before translation ");
     for(l=0;l<c;l++) {
       printf("%d",D[l]);  /*it s just for control */

    }

    for(z=0;z<c;z++){
printf("%c",alfabe[o]);
                      o=D[z];
                      word[z]=alfabe[o] ; break; }   




    printf("\nnew form of word: ");
    for(k=0;k<c;k++) {
       printf("%c",word[k]);

    }
scanf("%d");


}
4

3 回答 3

2

问题出在以下循环中。

for(z=0;z<c;z++){
    printf("%c",alfabe[o]);
    o=D[z];
    word[z]=alfabe[o] ; 
    break; 
}   

你怎么破了?它只是翻译第一个字符。其次,您需要减去 1 以获得字母数组的正确索引(重做您所做的添加)。

 word[z]=alfabe[o-1];

三、你是用o之前初始化的吗?您的编译器应该为此发出警告。第四,为什么要在大小为 24 的 char 数组中存储 27 个字符?

char alfabe[24]={'a','b',...........,'\0'}

最后但并非最不重要的一点是,您需要使用模运算,如果用户输入类似xyz.

于 2012-05-03T22:43:25.187 回答
1

好的,首先'\0'标记输入字符串的结尾,你不需要加密这个特定的字符,我的建议是把它放在第一个alfabet这样你会得到:

alfabet[24] = {'\0', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z'};

这将为您省去减去 1 的麻烦,因此您将拥有:

for (i = 0; i < c; i++)
{
    for (j = 0; j < 24; j++)
    {
        if (word[i] == alfabet[j])
        {  
            D[i] = 2 * j;
        }
    }
}

在对输入进行编码的部分。当您生成输出字时:

for (z = 0; z < c; z++)
{
    printf("%c", alfabet[D[z]]);
    word[z] = alfabet[D[z]];
}

不需要o,尤其是break;循环中没有。

一种更有效的方法是创建一个处理传递的字符串加密的函数:

char* getEncryptedWord(char* word)
{
    char alfabet[25]={'\0', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v', 'x', 'y','z'};

    int i, j;
    int size = strlen(word);

    char* encryptedWord = (char*) malloc(size + 1);

    for (i = 0; i < size; i++)
    {
            for (j = 0; j <= 25; j++)
            {
                    if (word[i] == alfabet[j])
                    {
                            if (2 * j > 25)
                                    encryptedWord[i] = alfabet[2 * j % 25];
                            else
                                    encryptedWord[i] = alfabet[2 * j];

                            break;
                    }
            }
    }

    encryptedWord[size] = '\0';

    return encryptedWord;
}

我已经添加'x'alfabet- 这就是现在有 25 个元素的原因。我敢肯定英语字母表中缺少一个字符,但现在是凌晨 3 点,英语不是我的主要语言。此外,此解决方案假设alfabet您提供的是输入和输出中应该存在的唯一字符。

于 2012-05-03T22:54:59.503 回答
0

(提示:如果你只期望字母AZ,你不需要循环遍历数组找到对应的数字,你可以简单地通过减去'a'的数值得到数字,然后加1,如果你想要字母“a”映射到 1。)

提到了模算术,但这会给您带来问题,因为您将失去 1:1 映射,即两个字母最终可能被转换为相同的数字。

于 2012-05-03T23:14:35.670 回答