перевести программу на JavaScript в C - PullRequest
3 голосов
/ 23 февраля 2010

У меня есть файл 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;
}

Прости мой английский, я френш. Mac Fly

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

sprintf требует, чтобы вы выделяли память самостоятельно.

Попробуйте изменить char *to; до

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

где start и stop - первые два аргумента подстроки

Возможно, вам придется включить stdlib.h, если вы еще не сделали

0 голосов
/ 23 февраля 2010

Похоже, вы зацикливаетесь на длине двух параметров log и pw. Но так как n выглядит так, как будто оно может быть установлено на максимум из этих двух длин, то вызов подстроки будет считывать после конца более короткого буфера в некоторой точке. В данном коде nbpass жестко запрограммирован на 6, поэтому неясно, каким будет намерение или результат. Тем не менее, кажется, что это может быть проблемой (может быть, вы хотите min результат?).

Как правильно указывает tzenes, вам нужно убедиться, что параметр dst вызова подстроки имеет допустимый буфер для использования. Если вы используете malloc, как он предлагает, убедитесь, что вы каждый раз освобождаете его (если он выделяется на каждой итерации).

Однако функция подстроки извлекает только один символ за раз. Если это желаемый результат, то следующее может быть более эффективным:

  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));
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...