从C中的字符串中删除重复的字符

问题描述 投票:0回答:2

我的程序必须查找重复的字符(一个接一个地出现)并删除它们。所以我的程序确实有效,但是如果我放“PLLNSIS”,我会得到“PLNSISS”。我覆盖了我发现的重复的字符,但最后,我收到了最后一个字符的副本。

 void main() 
    {
        int length;
        char *myString;
        printf("Enter the length of the string \n");
        scanf("%d", &length);
        myString = (char*)malloc((length+1) * sizeof(char));
        assert(myString);
        printf("Now enter the string: (max %d letters) \n", length);
        fseek(stdin, 0, SEEK_END); //flushing the buffer
        fgets(myString, length+1, stdin); //calling the input function
        no_Straight_Letters(myString);
        free(myString);
    }     

       void no_Straight_Letters(char *myString)
        {
            int i, j = 0, length = strlen(myString);
            for (i = 1; i < length-1; i++)
            {
                if (myString[j] == myString[i])
                {
                    myString[j] = myString[i];
                    myString[i] = '\0';
                }
                    else myString[++j] = myString[i];
            }
            myString[length] = '\0'; //last char of the string
            printf("And the new string is.... -->  ");
            puts(myString);
        }

我找到了原因,但是当我修复它时,屏幕上什么都没有。

c string
2个回答
2
投票

问题是

 myString[length] = '\0';

这将是

 myString[++j] = '\0';

这是有效的,因为在循环结束时j指向最后一个有效字符。然后,如果你增加它并将\0放在那里 - 它将成为字符串。

您可以模拟使用\n这一小额外添加的行为(不太可能需要)。

myString[++j]='\n';
myString[++j]=0;

此外,作为一个小修改,您可以删除代码中的冗余分配。这是不必要的。

if (myString[j] == myString[i])
{
    myString[i] = '\0';
}

2
投票

有两个问题:

首先,你错过了最后一个角色;你可能没有注意到它,因为你的fgets输入的最后一个字符可能是你看不到的换行符。所以你像for (i = 1; i <= length-1; i++)一样迭代。

其次,你切断了length的字符串,它比最后的字符串大;改用myString[j+1] = '\0'

小问题:你的if中的代码是无用的,你可以省略它。

void no_Straight_Letters(char *myString)
{
    int i, j = 0, length = strlen(myString);
    for (i = 1; i <= length-1; i++)
    {
        if (myString[j] != myString[i])
           myString[++j] = myString[i];
    }
    myString[j+1] = '\0'; //last char of the string
    printf("And the new string is.... -->  '%s'",myString);
}


int main()
{
    char myString[] = "PLLNSISSSHERBERTTTA";
    no_Straight_Letters(myString);
}
© www.soinside.com 2019 - 2024. All rights reserved.