#include<stdio.h>
#include<string.h>
#include<assert.h>
int testsFailed = 0;
int testsExecuted = 0;
void testDistance(char s[], char t[], int expected );
int levenshtein( char s[], char t []);
int minimum( int minimum[] );
int main()
{
printf( "Testing typical cases.\n" );
//testDistance( "kitten", "kitten", 0 );
testDistance( "kitten", "sitting", 3 );
/*testDistance( "kitten", "mittens", 2 );
testDistance( "balloon", "saloon", 2 );
testDistance( "hello", "doggo", 4 );
testDistance( "\t\thi", "\t\t\t\thi", 2 );
printf( "\nTesting empty/edge cases.\n" );
testDistance( "", "", 0 );
testDistance( "hello", "", 5 );
testDistance( "", "doggo", 5 );
testDistance( "a", "b", 1 );
testDistance( "b", "b", 0 );
testDistance( " ", " ", 0 );
printf( "\nThis might take a while...\n" );
testDistance( "12345678901", "123456789012", 1 ); // how many chars are we looking at?
printf( "\n******These tests will be opposite in the C version******\n" );
printf( "\n******These tests **should** FAIL in the C version*******\n" );
testDistance( "kitten", "mitten\0s", 3 ); // ????
testDistance( "\0totally", "\0different", 9 );
printf( "\nTotal number of tests executed: %d" ,testsExecuted );
printf( "Number of tests passed: %d",testsExecuted - testsFailed);
printf( "Number of tests failed: %d" ,testsFailed );*/
return 0;
}
void testDistance(char s[], char t[], int expected )
{
int distance = levenshtein( s, t );
if ( distance == expected )
{
printf( "Passed! You can get from %s to %s in %d moves.\n",s,t,expected );
//printf("%c, %c",cpys,cpyt);
}
else
{
printf( "FAILED: I thought it would take %d moves, but apparently it takes %d moves to get from %s to %s\n",expected,distance ,s,t);
testsFailed++;
}
testsExecuted++;
}
int levenshtein( char s[], char t[])
{
int cost;
int distance;
char deleteS[sizeof(s)];
char deleteT[sizeof(t)];
printf("%s, %s\n",s,t);
if (strlen(s) == 0)
{
distance = strlen(t);
}
else if (strlen(t) == 0)
{
distance = strlen(s);
}
else
{
if (s[0] == t[0])
{
cost = 0;
}
else
{
cost = 1;
}
int i;
for( i= 1; i < sizeof(s);i++)
deleteS[i-1] = s[i];
int j;
for( j = 1; j < sizeof(t);j++)
deleteT[j-1] = t[j];
printf("%s,%s\n",deleteS,deleteT);
///////////
//printf("%d,%d\n",strlen(deleteS),strlen(s) -1);
assert(strlen(deleteS)== strlen(s) -1);
//printf("%d,%d\n",strlen(deleteT),strlen(t) -1);
assert(strlen(deleteT)== strlen(t) -1);
printf(" %c,%c\n",s[strlen(s)-1],deleteS[strlen(deleteS)-1]);
assert(s[strlen(s)-1] == deleteS[strlen(deleteS)-1]); //这里有问题
printf(" %c,%c\n",t[strlen(t)-1],deleteT[strlen(deleteT)-1]);
assert(t[strlen(t)-1] == deleteT[strlen(deleteT)-1]);
///////////
int input[] = { levenshtein(deleteS, t) + 1, levenshtein(s, deleteT) + 1, levenshtein(deleteS, deleteT) + cost };
distance = minimum(input);
}
return distance;
}
int minimum( int minimum[] )
{
int min = 0;
assert( sizeof(minimum) > 0 );
if ( sizeof(minimum) > 0 )
{
min = minimum[0];
int i;
for ( i = 1; i < sizeof(minimum); i++ )
{
if ( minimum[i] < min )
{
min = minimum[i];
}
}
}
return min;
}
这是我的c代码
public class Levenshtein
{
private static int testsFailed = 0;
private static int testsExecuted = 0;
public static void main( String[] args )
{
System.out.println( "Testing typical cases.\n" );
//testDistance( "kitten", "kitten", 0 );
testDistance( "kitten", "sitting", 3 );
/*testDistance( "kitten", "mittens", 2 );
testDistance( "balloon", "saloon", 2 );
testDistance( "hello", "doggo", 4 );
testDistance( "\t\thi", "\t\t\t\thi", 2 );
System.out.println( "\nTesting empty/edge cases.\n" );
testDistance( "", "", 0 );
testDistance( "hello", "", 5 );
testDistance( "", "doggo", 5 );
testDistance( "a", "b", 1 );
testDistance( "b", "b", 0 );
testDistance( " ", " ", 0 );
System.out.println( "\nThis might take a while...\n" );
testDistance( "12345678901", "123456789012", 1 ); // how many chars are we looking at?
System.out.println( "\n******These tests will be opposite in the C version******\n" );
System.out.println( "\n******These tests **should** FAIL in the C version*******\n" );
testDistance( "kitten", "mitten\0s", 3 ); // ????
testDistance( "\0totally", "\0different", 9 );
System.out.println( "\nTotal number of tests executed: " + testsExecuted );
System.out.println( "Number of tests passed: " + (testsExecuted - testsFailed) );
System.out.println( "Number of tests failed: " + testsFailed );*/
}
public static void testDistance( String s, String t, int expected )
{
int distance = levenshtein( s, t );
if ( distance == expected )
{
System.out.println( "Passed! You can get from '" + s + "' to '" + t + "' in " + expected + " moves." );
}
else
{
System.out.println( "FAILED: I thought it would take " + expected + " moves, but apparently it takes " + distance +
" moves to get from '" + s + "' to '" + t + "'." );
testsFailed++;
}
testsExecuted++;
}
public static int levenshtein( String s, String t )
{
int cost;
int distance;
String deleteS;
String deleteT;
if (s.length() == 0)
{
distance = t.length();
}
else if (t.length() == 0)
{
distance = s.length();
}
else
{
if (s.charAt(0) == t.charAt(0))
{
cost = 0;
}
else
{
cost = 1;
}
deleteS = s.substring(1);
deleteT = t.substring(1);
assert(deleteS.length() == s.length() - 1);
assert(deleteT.length() == t.length() - 1);
//System.out.println(s +","+ deleteS+"111");
assert(s.endsWith(deleteS));
assert(t.endsWith(deleteT));
//System.out.println(s +","+ deleteS+"111");
distance = minimum(new int[] { levenshtein(deleteS, t) + 1,
levenshtein(s, deleteT) + 1,
levenshtein(deleteS, deleteT) + cost });
}
return distance;
}
public static int minimum( int minimum[] )
{
int min = 0;
assert( minimum.length > 0 );
if ( minimum.length > 0 )
{
min = minimum[0];
for ( int i = 1; i < minimum.length; i++ )
{
if ( minimum[i] < min )
{
min = minimum[i];
}
}
}
return min;
}
}
这是我的java代码
我将这java代码转成了c语言的
我取了其中一个例子:testDistance( "kitten", "sitting", 3 );
问题出现在了c语言里的第100行 : assert(s[strlen(s)-1] == deleteS[strlen(deleteS)-1]);
到到最后一步的时候kitten会变成n,然后和它的下一个比较(n的下一个比较特殊,它应该是一个空值),n是不等于空值的,所以 assert(s[strlen(s)-1] == deleteS[strlen(deleteS)-1]);会停止程序运行,这个我是可以理解的,但是我不明白为什么在java的代码里面(这一个assert(s.endsWith(deleteS));)n和空值比较然后assert会是正确的
以上都是我的理解,我的理解要是有什么不对希望可以帮忙分析一下,还是说我java转换c语言的时候漏了什么,要是写错了应该怎么改,大佬们来指点一下
int levenshtein( char s[], char t[])中sizeof(s)值是4(32位环境,64位是8),也就是字符串指针的长度。
strlen(deleteT)得到是字符串长度,第100行是越界访问
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632