2016-12-18 4 views
-4

Это вопрос, который я сейчас работаю: http://www.geeksforgeeks.org/recursively-remove-adjacent-duplicates-given-string/Неожиданное поведение в C

Вот мой код в Java за один проход:

/*If a character isn't repeating, copy it to str[j]. 
* Find start and end indices of repeating characters. Recursively call again 
* And starting position now should be end+1. Pass j and starting position */ 
public class removeDuplicates { 

public static void main(String[] args) 
{ 


    char[] str = {'c','c'}; 
    removeDups(str,0,0,0); 
    System.out.println(str); 

} 

public static void removeDups(char[] str,int j, int start,int flag) 
{ 
    /*Check if start character is repeating or not. If yes , then loop till you find 
    * another character. Pass that characters index(new start) into a recursive call*/ 

    if(start == str.length-1) 
    { 
     if(flag!=1) 
     { 
      str[j] = str[start]; 
      j++; 

     } 
     if(j<=str.length-1) 
     { 


      str[j] = '0'; 

     } 

    } 

    while(start<str.length-1 && str[start]!='0') 
    { 

     if(str[start+1]!=str[start]) 
     { 

      str[j] = str[start]; 

      start++; 
      j++; 
      if(start==str.length-1) {removeDups(str,j,start,flag);} 
     } 


     else 
     { 
      char ref = str[start]; 

      while(str[start]==ref) 
      { 

       if(start<str.length-1) 
       { 
        start++; 
       } 
       else 
       { 
        flag =1; 
        break; 

       } 

      } 

      removeDups(str,j,start,flag); 
      return; 

     } 

    } 




} 
} 

Это работает, как ожидалось. Здесь я просто пытаюсь использовать 0 вместо \ 0 символ как в C. Теперь, когда я перевести код на C

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

void removeDups(char *str,int j, int start,int flag) 
{ 
    /*Check if start character is repeating or not. If yes , then loop till you find 
    * another character. Pass that characters index(new start) into a recursive call*/ 



    if(start == strlen(str)-1) 
    { 
     if(flag!=1) 
     { 
      str[j] = str[start]; 
      j++; 

     } 
     if(j<=strlen(str)-1) 
     { 


      str[j] = '\0'; 



     } 

    } 

    while(start<strlen(str)-1 && str[start]!='0') 
    { 

     if(str[start+1]!=str[start]) 
     { 

      str[j] = str[start]; 

      start++; 
      j++; 
      if(start==strlen(str)-1) {removeDups(str,j,start,flag);} 
     } 


     else 
     { 
      char ref = str[start]; 

      while(str[start]==ref) 
      { 

       if(start<strlen(str)-1) 
       { 
        start++; 
       } 
       else 
       { 
        flag =1; 
        break; 

       } 

      } 

      removeDups(str,j,start,flag); 
      return; 

     } 

    } 





} 

int main() 
{ 


char str[] = "abcddcba"; 

int len = 
while() 

for(int i=0;str[i]!='\0';i++) 
{ 

    printf("%c",str[i]); 
} 
printf("\n"); 
} 

Приведенный выше код дает разные результаты по сравнению с Java code.Its практически идентичны , просто я использую strlen() вместо str.length (как в Java).

Интересная часть: если изменить часть для

if(j<=strlen(str)-1) 
     { 


      str[j] = '\0'; 

      return; 
} 

она прекрасно работает. Я только что добавил оператор return в оператор if.

Почему это происходит? Идентичный код, создающий разные результаты в C и Java

ответ

0

В C присвоение символа в строке '\0' изменяет длину, поэтому после этого strlen() вернет другой результат. В вашем Java-коде вы используете массив, и длина массива никогда не изменяется. Вы устанавливаете символ '0' вместо '\0', которые являются двумя разными вещами, но даже если вы установили его в '\0', он все равно не изменил бы длину. Я не изучил весь ваш код, но это одна очевидная вещь, которая приведет к разным результатам.

+0

Да, это предполагаемое поведение. – Anant

+0

Вы говорите, что целью Java-кода было изменение длины? В этом случае код Java не работает. 'str.length' не изменяется только потому, что вы установили элемент в' '0''. Однако, как я уже сказал, я недостаточно тщательно изучил ваш код, чтобы понять, что работает и что не работает. – ajb

0

Вы используете инструкцию return, а затем весь код ниже, что return исключается из работы для этой итерации.

Кроме того, вы можете понять, что такое \0 и чем оно отличается от 0. Вот ссылка:

What does the \0 symbol mean in a C string?

Смежные вопросы