java代码转c语言,发生了问题

#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