我正在尝试创建一个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;
}
答案 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::vector
和std::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;
}