C语言中的意外行为

C语言中的意外行为,c,string,C,String,这是我正在研究的问题: 以下是我用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 */ publi

这是我正在研究的问题:

以下是我用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而不是C中的\0字符。现在,当我将代码转换为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代码相比,上面的代码给出了不同的结果,实际上是相同的,只是我在Java中使用strlen而不是str.lengthas

有趣的是:如果我把部分改为

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


            str[j] = '\0';

            return;
}
它工作得很好。我刚刚在if语句中添加了一个return语句


为什么会这样?在C和Java中产生不同结果的相同代码

在C中,将字符串中的一个字符赋给“\0”会更改长度,因此strlen将在这之后返回不同的结果。在Java代码中,您使用的是数组,数组长度永远不会改变。您将字符设置为“0”而不是“\0”,这是两种不同的设置,但即使您将其设置为“\0”,它仍然不会更改长度。我还没有检查您的全部代码,但这显然会导致不同的结果。

您使用的是return语句,随后该return下面的所有代码都将被排除在该迭代的运行之外

此外,您可能希望了解\0是什么以及它与0的区别。 以下是链接:


是的,这是预期的行为。你是说Java代码的目的是改变长度?在这种情况下,Java代码不起作用。str.length不会因为将元素设置为“0”而更改。然而,正如我所说,我还没有充分研究您的代码,以了解哪些代码有效,哪些代码无效。