-2

単純な暗号化プログラムを作成しようとしていますが、数学的なものは何もありませんが、さらに先に進むには、プログラムでセグメンテーション違反の原因を知る必要があります。コードを簡素化しようとしました..

char *
createAlfabeth(void)
{
    char * alfa = NULL;
    strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    int i, j=1, k=0;

    for(i=0; i<(sizeof(alfa)/sizeof(char)); i++, j+=3)
    {
        if(j>25)
        {
            j=1+(k++);
        }
        swap(alfa, i, j);
     }

     return alfa;
}

char *
codificator(char *mess, const char *alfa)
{
     int key[]=PRIVATE_KEY;
     char *newmess=NULL;
     int i, j;
     for(i=0, j=0; mess[i]!='\0'; i++, j++)
     {
          if(j>(sizeof(key)/sizeof(key[0])))
          {
               j=0;
           }
      newmess[i]=alfa[i+key[j]];
     }
     return newmess;
 }

 int
 main(void)
 {
     char *alfa=crearAlfabeto();
     printf("write your message :\n");
     char message[20];
     scanf("%s", message);
     char *codified=codificator(message, alfa);
     printf("The codified message is: %s \n", codified);    
     return 0;
 }

解決済み: メモランダムの投稿

以下のouahとaskmishによる推奨事項で問題を解決しました(両方に感謝します)。そして、この答えをグーグルで調べているあなたのために、この問題はヒープ処理に関係していると言いたいです。後で宣言または初期化した文字列に十分なスペースを保存しなかったため、それらに十分なメモリが割り当てられませんでした。

これは、malloc、realloc、calloc (および free) 関数の目的である処理です。セグメンテーション違反は、コード内のデータ セグメントに割り当てられたメモリを超えて移動しようとしたことが原因です。すべてのプログラムは、コード (コード セグメント) とデータ (データ セグメント) にメモリを割り当て、データ セグメントに格納する量を c で明示的に指定しないと、このエラーが発生します。これは私が読んだことに対する私の理解です。より洞察力のある人がこれについてコメントしたい場合は、コメントしてください..

4

2 に答える 2

4
 char * alfa = NULL;
 strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");

配列オブジェクトにメモリを割り当てる必要があります。

例えば:

 char *alfa = malloc(sizeof "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
 /* check that malloc succeeds here */
 strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
于 2012-10-19T23:52:16.933 に答える
1

ouahの答えに加えて:これの代わりにcodificator

 char *newmess=NULL;
 int i, j;
 for(i=0, j=0; mess[i]!='\0'; i++, j++)
 {
      if(j>(sizeof(key)/sizeof(key[0])))
      {
           j=0;
       }
  newmess[i]=alfa[i+key[j]];
 }

これを書きます:

 char *newmess=NULL;
 int i, j;
 newmess = malloc(strlen(mess)*sizeof(char)); //This line could be written in many ways
 if(newmess != NULL) //Handle memory allocation failing.
 {
   for(i=0, j=0; mess[i]!='\0'; i++, j++)
   {
      if(j>(sizeof(key)/sizeof(key[0])))
      {
           j=0;
      }
      newmess[i]=alfa[i+key[j]];
   }
  }

ポインターを文字列で使用する前に、ポインターにメモリを割り当てていることを確認してくださいSeg Faults。セグメンテーション違反を取り除くには、私のものと ouah の両方の修正を使用する必要があります。

于 2012-10-20T00:31:10.287 に答える