我正在尝试制作一个ac / 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;
}
注意代码中的行:
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)
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句