3

私はjavascriptファイルを持っていて、それをCに翻訳したいのですが、それを実行しましたが、大きなランタイムエラーが発生します。関数がintを返すまで、すべてがうまく機能します。バグがどこにあるかについていくつかのアイデアがある場合。どうもありがとう。

#ifndef max
    #define max( a, b ) ( ((a) > (b)) ? (a) : (b) )
#endif

char *substring(size_t start, size_t stop, const char *src, char *dst, size_t size)
{
   int count = stop - start;
   if ( count >= --size )
   {
      count = size;
   }
   sprintf(dst, "%.*s", count, src + start);
   return dst;
}

int CrackLog(char log[], char pw[])
{
    int tabc=3696619; //7
    char tab[]="                   azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789_$&#@";
    int i,checksum;

        checksum=tabc;
        int nblog=strlen(log);
        int nbpass=6;//6
        int sum=1;
        int n = max(nblog,nbpass);

        for (i=0;i<n;i++)
        {
            char *to;
            to = substring(i, i+1, log, to, sizeof to);
            int index1=strcspn(tab, to)+10;

            to = substring(i, i+1, pw, to, sizeof to);
            int index2=strcspn(tab, to)+10;

            sum=sum+(index1*n*(i+1))*(index2*(i+1)*(i+1));
        }

        if (sum==checksum) {
            return 1;
        }else
                    return 0;
}

私の英語を許してください私は熱狂的です。マックフライ

4

2 に答える 2

1

sprintfでは、自分でメモリを割り当てる必要があります。

に変更char *to; してみてください

char *to = (char*) malloc(sizeof(char)*(stop-start));

ここで、startとstopは、部分文字列の最初の2つの引数です。

stdlib.hまだ含めていない場合は、含める必要があるかもしれません

于 2010-02-22T23:51:57.243 に答える
0

log2つのパラメータとの長さをループしているようですpw。ただし、nこれら2つの長さの最大値に設定されているように見えるため、サブストリング呼び出しは、ある時点で短いバッファーの終わりを超えて読み取られます。指定されたコードでは、nbpassは6にハードコードされているため、意図または結果が正確にどのようになるかは不明です。それにもかかわらず、それは問題である可能性があるようです(多分あなたはmin結果が欲しいですか?)。

tzenesが正しく指摘しているようdstに、部分文字列呼び出しのパラメーターに使用する有効なバッファーがあることを確認する必要があります。彼が提案するようにmallocを使用する場合は、毎回必ず解放してください(反復ごとに割り当てられている場合)。

ただし、部分文字列関数は一度に1文字しか抽出しません。それが望ましい結果である場合は、次の方が効率的である可能性があります。

  char to[2];
  to[1] = '\0';  // null terminate
  for (i=0;i<n;i++)
     {
     to[0] = log[i];
     int index1=strcspn(tab, to)+10;

     to[0] = pw[i];
     int index2=strcspn(tab, to)+10;

     sum=sum+(index1*n*(i+1))*(index2*(i+1)*(i+1));
     }
于 2010-02-23T00:56:59.850 に答える