1

私は単純な暗号化アルゴリズムを作成しようとしています。私の目的はabc(任意の単語)を123に翻訳することです。次に、いくつかの関数を適用してから、もう一度テキストに翻訳します。これが私のアルゴリズムです。ファイリングに問題があります。暗号化されていないものを作成します。 「helloworld」内に書かれているtxtは、encrypted.txtを作成しているが、worl dを書いているだけのデバッグプログラムです。なぜ、helloworldを書いていません。常に最後の単語とスペース「world」を取ります。

https://www.dropbox.com/s/i3afkm439iv3d0v/last%20form.txtを編集 します。これは、暗号化のために複数の2とmod27を追加した最後のフォームです。 txtfile.its暗号化pjxxcpjxxcpjxxcpjxxcscixhpjxxcqscixhqpjxxcscixhですが、pjxxcscixhである必要があります

   #include <cstdlib>
    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    #include <conio.h>



    int main()
    {   
        int g,p,sak,v,r,t,z,o,c,l,i,j,k,*D;


    char alfabe[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','\0'}; 
     FILE *fp1;
     FILE *mat;
       char word[20];

       fp1 = fopen("unencrypted.txt","r");
       do {
          g = fscanf(fp1,"%s",word); /* dosyadan bir kelime oku... */
          if (g != EOF) {
                mat=fopen("encrypted.txt","w") ;


        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]=(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++){

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





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

           fprintf(mat," %c",word[k]);

        }
    fclose(mat);
    }


    } while (g != EOF);          
       fclose(fp1);   }
4

4 に答える 4

2

なぜそれはhelloworldを書いていないのですか?

do-whileループで毎回ファイルを開きます。

            mat=fopen("encrypted.txt","w") ;

そのため、内容が上書きされるたびに。その結果、最後の単語だけが書き込まれます。したがって、「こんにちは」は消えます。

しかし、書かれた世界

なぜなら、fprintfでは空白を使用しているからです。

   fprintf(mat," %c",word[k]);

それを修正するには:

  1. ファイルを1回だけ開きます。
  2. から空白を削除しfprintfます。fprintf(mat、 "%c"、word [k]);
于 2012-05-04T11:55:47.747 に答える
0

これは、「w」書き込みモードでファイルを開いているためです。これにより、前のコンテンツがクリアされます。「a+」モードで開いてみてください。

于 2012-05-04T11:54:52.740 に答える
0

ループ内に書き込むためにファイルを開いています。

do {
    ...
    mat=fopen("encrypted.txt","w") ;
    ...
    // writing to file
    ...
    } while(g != EOF);

その結果、ループを繰り返すたびに、古いファイルの内容が消去されます。

于 2012-05-04T11:56:00.037 に答える
0

使用しているfscanf(...,"%s",...);

これは単純な理由で間違っています。バッファがいくら大きくても、入力は常に1バイト長くなる可能性があります。

入力は一度に1文字ずつ処理するため、一度に1文字ずつ読み取る必要があります。

クレイジーループ

あなたが書くつもりだったと確信していますD[i] = word[i]-'a';。さらに、文字が小さなアルファベット文字であるかどうかを、を使用してテストする必要がありますislower()

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

今、これはあまり意味がありません。キャラクターがの場合はどうなりaますか?にアクセスしalfabe[-1]ます。

于 2012-05-04T11:58:55.753 に答える