运行程序时出现运行时错误,但是当我使用调试器时出错

时间:2015-01-31 19:17:38

标签: c++ c

我正在尝试创建一个c / c ++程序,程序接受带有多个单词的txt文件,每行一个,并找到具有特定单词的编辑距离(也称为levenshtein距离)。

我有一个奇怪的问题。

当我在代码块中运行它时,我的代码在读取几个单词后遇到运行时错误。当我使用代码块调试器时它调试很好。

我一直在环顾四周,发现未初始化的变量可能是一个问题。但每当我评论我调用函数minDistance count[i]=minDistance(word,lines[i]);的行时,代码运行正常并打印出文件中的所有单词。所以我猜这不是问题。

任何帮助都会很棒。谢谢。

以下是代码。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<iostream>


using namespace std;
static int minDistance(char* word1, char* word2)
{
    const int l1 = strlen(word1);
    const int l2 = strlen(word2);
    int i=0,j=0;
    int **d = new int*[l2 + 1];
    for(i=0;i<l1+1;++i)
        d[i]=new int[l1+1];

    // the edit distance between an empty string and the prefixes of
    // word2
    for (i = 0; i < l2 + 1; i++) {
        d[0][i] = i;
    }

    // the edit distance between an empty string and the prefixes of
    // word1
    for (j = 0; j < l1 + 1; j++) {
        d[j][0] = j;
    }

    for (i = 1; i < l1 + 1; i++) {
        for (j = 1; j < l2 + 1; j++) {
            if (word1[i - 1] == word2[j - 1]) {
                d[i][j] = d[i - 1][j - 1];
            } else {
                d[i][j] = min(min(1 + d[i][j - 1], 1 + d[i - 1][j]),
                1 + d[i - 1][j - 1]); // min of insertion,
                // deletion, replacement
            }
        }
    }

    return d[l1][l2];
}

void lines()
{
  int i=0;
  char * lines[10];
  int count[10];
  char word[]="book";
  FILE *file_handle = fopen ("wordlist.txt", "r");

  for (i =0; i < 5; ++i)
    {
    lines[i] = (char*)malloc (128); /* allocating a memory slot of 128 chars */
    fscanf (file_handle, "%s", lines[i]);
    count[i]=minDistance(word,lines[i]);
    cout<<lines[i]<<" ";
    cout<<count[i]<<endl;
    }

  for (i =0; i < 5; ++i)
    free (lines[i]);

}
int main (int argc, char *argv[])
{
  lines();
  return 0;
}

2 个答案:

答案 0 :(得分:2)

注意代码中的行:

int **d = new int*[l2 + 1];
for(i=0;i<l1+1;++i)

您正在为(l2 + 1)int*分配内存,并且正在从i循环0 to (l1 + 1)。因此,如果l2 < l1,您正在访问尚未分配的内存。

也不要混用C ++和C.使用C或坚持使用C ++。正如评论中所提到的,如果您可以使用C ++,请使用std::vectorstd::string - 它会减轻您的头痛。还可以使用C ++的IO类来执行文件IO,并始终关闭您打开的任何文件。 (即在C中,使用fclose(file_ptr))。

答案 1 :(得分:0)

您使用l2作为第二个索引。它应该是你的第一个索引,l1是你的第二个索引。

// the edit distance between an empty string and the prefixes of
// word2
for (i = 0; i < l1 + 1; i++) {
    d[0][i] = i;
}