对递归函数的char *数组操作

时间:2014-09-22 10:33:53

标签: c arrays string algorithm recursion

我有一个程序可以计算两个字符串的编辑距离。它还输出所有编辑操作以获得完整的转换。 我写了一个递归函数,探索由编辑距离计算函数填充的矩阵并重建路径

void reconstruct_path(char * s1,char * s2,int i,int j,matrix_t matrix)

 void reconstruct_path(char *s1, char *s2 int i, int j , matrix_t matrix)
 {
    if(matrix[i][j].parent == -1) return;


    if (matrix[i][j].parent == MATCH) 
    {
    reconstruct_path(s1,s2,i-1,j-1,matrix);
    match_out(s1, s2 , i, j);
    return;
    }

    if (matrix[i][j].parent == INSERT) 
    {
    reconstruct_path(s1,s2,i,j-1,matrix);
    insert_out(s2, j);
    return;
    }

    if (matrix[i][j].parent == DELETE) 
    {
    reconstruct_path(s1,s2,edit,i-1,j,matrix);
    delete_out(s1, i);
    return;
    }

}`

你可以注意到这个函数调用了三个函数

- void match_out(char *s1, char *s2,int i, int j)
- void insert_out(char *t, int j)
- void delete_out(char *s, int i)

void match_out(char * s1,char * s2,int i,int j)

void match_out(char *s1, char *s2 ,int i, int j)
{
    if (s1[i] == s2[j]) 
    {
        printf("M no edit needed \n" );
    }
    else 
    {
        printf("S subst %c with %c \n",s1[i] , s2[j]);
    }
}

void insert_out(char * t,int j)

void insert_out(char *t, int j)
{
    printf("I Insert %c\n",t[j]);
}

void delete_out(char * s,int i)

void delete_out(char *s, int i)
{
    printf("D delete %c\n",s[i]);
}

这会产生这样的输出

  

从“父母”到“堂兄”:

     

S sub p with c
  S sub a with o
  S sub r with u
  用s
表示   S sub n with i
  S取代n

我想改进这一点以获得更精确的输出:

  

从“父母”到“堂兄”:

     

具有c父母的S pp - >看护人   S sub a with carent - > corent
  S core r with u corent - > couent
  具有优先权的S - 具体 - > cousnt   S sub n with i cousnt - > cousit
  s取代n cousit - >表妹

你有什么建议吗? (我对C字符串操作不太好)


[从评论更新为this answer:]

s1s2收到的两个字符串的数据类型是什么? (由vj1207提问)

它们在main()中声明为char *str_a = " parent"; char *str_b = " cousin";

1 个答案:

答案 0 :(得分:2)

您可以在 match_out

中添加几行
void match_out(char *s1, char *s2, char **edit ,int i, int j)
{
    if (s1[i] == s2[j]) 
    {
        printf("M no edit needed \n" );
    }
    else 
    {
        printf("S subst %c with %c ",s1[i] , s2[j]);
        //**from here**
        printf("%s -> ",s1);
        s1[i]=s2[j];
        printf("%s\n",s1);
        //upto here
    }
}

更新

您可以将char数组声明为

char str[]= {'p','a','r','e','n','t'};

如果您将其声明为

char * str = "parent";

然后你无法修改它。这就是你得到上述错误的原因。