-4

エンクリプターとデクリプターをプログラムしようとしています。私の問題は、最初に値を割り当てたポインタがまだ2番目と同じ値を持っていることです。free を使用しようとしましたが、問題は同じです。たとえば、aslkdjlasc (サンプルのみ) と入力すると、出力は次のようになります。

プログラムを再度実行しようとすると、daskjda と入力して、doctorxRLD のような出力が表示されます。

RLD は、このポインターの過去の値から取得されます。本来は 7 文字ですが、helloworld が 10 であるため、最初の 7 文字は暗号化によって置き換えられますが、最後の 3 文字は引き続き出力されます。

私は何をしますか?

更新: ここにコードの一部があります:

void encrypt(char *crypt)
{
char *plaintext,*encryption,slash=0x2F;
int i,j,k,flags,f;
encryption=(char *)malloc(sizeof(int));
plaintext=(char *)malloc(sizeof(int));
printf("Enter plaintext, spaces,commas,and dots should be represented as /:\n");
scanf("%s",&*plaintext);
for(i=0;i<strlen(plaintext);i++)
{
    j=1;flags=0;
    while(j<53 && flags==0)
    {
        if(plaintext[i]==slash)
        {
            encryption[i]=slash;
            flags=1;
        }
        if(plaintext[i]==crypt[j])
        {
            encryption[i]=crypt[j-1];
            flags=1;
        }
        k=j+2;
        j=k;
    }
}
printf("%s",encryption);
    free(encryption);
    free(plaintext);
getch();
}

これがメインです

main()
{
char c;
int timer;
char crypt[53]="***i have hidden my encryption code***";
clrscr();
printf("Press e to encrypt, d to decrypt, ESC to exit.\n");
c=getch();
switch(c)
{
    case(0x1b):
        exit(0);
        break;
    case(0x64):
        decrypt(crypt);
        break;
    case(0x65):
        encrypt(crypt);
        break;
    default:
        printf("INVALID. FORCE EXIT IN 3 SEC0NDS.");
        delay(3000);
        exit(0);
}

getch();
}
4

2 に答える 2

1

コードでは、文字列に整数サイズ (4 バイト) のメモリを割り当てています。

あなたがするとき

plaintext=(char *)malloc(sizeof(int));

あとはこうすることで

scanf("%s",&*plaintext);

その4文字を超えるサイズの文字列をスキャンしている可能性があります(ただし、4バイトしか割り当てていません)

scanf("%s",&*plaintext);scanf("%s",plaintext);( 前のステートメントでは、不要な計算を追加しています。

于 2013-07-28T10:06:25.057 に答える
0

それは私です。私はすでにそれを手に入れました。厳しいコメントもありましたが、ありがとうございました。笑

  1. どうやら DCoder が私がそれらを使用する方法がわからないことを指摘したので、私は malloc の使用を控えました。
  2. Sanyam Goel に感謝します。scanf も修正しました。
  3. 4 つではなく 2 つのポインターのみを使用しました。decrpyt 関数と encrypt 関数のそれぞれではなく、メイン関数でそれらをインスタンス化しました。このような:

    main() { char c,*from, *to; ..........

    void encrypt(char *crypt,char *plaintext,char *encryption)

    void encrypt(char *crypt,char *ciphertext,char *decryption)

したがって、どちらかを呼び出すときは、次のように入力します。

    case(0x64):
        decrypt(crypt,from,to);
        break;
    case(0x65):
        encrypt(crypt,from,to);
        break;

そして、メイン関数のスイッチの最後に:

    free(from); from=NULL;
    free(to); to=NULL;

これで、不要なポインターと余分なプロセスを削除できました。

みんなありがとう。:)

于 2013-07-28T11:24:31.707 に答える