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初期化する前に使用していますか?コンパイラはこれについて警告するはずです。第 4 に、サイズ 24 の char 配列に 27 文字を格納するのはなぜですか?

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

最後になりましたが、モジュラー演算を使用する必要があります。ユーザーが のようなものを入力すると、これは機能しませんxyz

于 2012-05-03T22:43:25.187 に答える
1

OK、まず'\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 の要素がある理由です。英語のアルファベットが 1 文字欠けているのは確かですが、ここは午前 3 時で、英語は私の第一言語ではありません。また、このソリューションはalfabet、入力と出力に存在するはずの文字だけが提供されているという前提で機能しています。

于 2012-05-03T22:54:59.503 に答える
0

(ヒント: A から Z の文字のみが必要な場合は、対応する数値を見つけるために配列をループする必要はありません。必要に応じて、「a」の数値を減算して 1 を追加するだけで数値を取得できます。文字 'a' を 1 にマップします。)

モジュロ演算について言及されていますが、1:1 マッピングが失われるため、問題が発生します。つまり、2 つの文字が同じ数値に変換される可能性があります。

于 2012-05-03T23:14:35.670 に答える