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 是 substring 的前两个参数

stdlib.h如果你还没有,你可能必须包括

于 2010-02-22T23:51:57.243 回答
0

看起来您正在循环两个参数的长度logpw. 但是由于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));
     }
于 2010-02-23T00:56:59.850 回答