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

从C中的字符串中删除重复字符,c,string,C,String,我的程序必须寻找重复的字符(一个接一个地出现)并删除它们。所以我的程序确实有效,但如果我输入“PLLNSIS”,我会得到“PLNSISS”。我覆盖了我发现重复的字符,但最后,我收到了最后一个字符的副本 void main() { int length; char *myString; printf("Enter the length of the string \n"); scanf("%d", &length)

我的程序必须寻找重复的字符(一个接一个地出现)并删除它们。所以我的程序确实有效,但如果我输入“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);
        }
void main()
{
整数长度;
char*myString;
printf(“输入字符串的长度\n”);
扫描频率(“%d”和长度);
myString=(char*)malloc((长度+1)*sizeof(char));
断言(myString);
printf(“现在输入字符串:(最多%d个字母)\n”,长度);
fseek(stdin,0,SEEK_END);//刷新缓冲区
fgets(myString,length+1,stdin);//调用输入函数
没有直接的字母(myString);
免费(myString);
}     
无效无直字母(char*myString)
{
int i,j=0,长度=strlen(myString);
对于(i=1;i”);
puts(myString);
}
我找到了原因,但当我修复它时,屏幕上什么也看不到。

问题是

 myString[length] = '\0';
会的

 myString[++j] = '\0';
这是因为循环的末尾
j
指向最后一个有效字符。然后,如果您增加它并将
\0
放在那里,它将生成字符串

您可以通过这个小的添加来模拟拥有
\n
的行为(这可能不需要)

另外,作为一个小的修改,您可以删除代码中的冗余赋值。没必要

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

 myString[length] = '\0';
会的

 myString[++j] = '\0';
这是因为循环的末尾
j
指向最后一个有效字符。然后,如果您增加它并将
\0
放在那里,它将生成字符串

您可以通过这个小的添加来模拟拥有
\n
的行为(这可能不需要)

另外,作为一个小的修改,您可以删除代码中的冗余赋值。没必要

if (myString[j] == myString[i])
{
    myString[i] = '\0';
}
有两个问题:

首先,你错过了最后一个角色;您可能没有注意到,因为您的
fgets
-输入的最后一个字符可能是您没有看到的新行。因此,您可以像
那样迭代(i=1;i有两个问题:


首先,您错过了最后一个字符;您可能没有注意到它,因为您的
fgets
-输入的最后一个字符可能是一个您看不到的换行符。因此,您需要像
那样迭代(i=1;i您在“修复”它时添加了什么?两次UB:1。)它至少是
int main(void)
2。)
无直连字母()
的原型丢失。“我找到了原因”所以为什么不告诉读者你认为它是什么??提示:如果你“删除”了一个字母,你就缩短了字符串,所以
0
-终止符的位置需要改变,不是吗?@underline\u d,因为我认为我不能很好地解释它,但是如果你坚持-当我放置'\0'而不是重复的字符时,程序会比较下一个字符和最后一个不是重复的字符。然后,她覆盖新字符而不是“\0”,并且这个过程会一次又一次地进行。希望我能澄清一下。你对“修复”它添加了什么?两次UB:1。)它至少是
intmain(void)
;2.
no_stright_Letters()
的原型丢失。“我找到了原因”,所以为什么不告诉读者你认为它是什么??提示:如果你“删除”了一个字母,你就缩短了字符串,所以
0
-终止符的位置需要改变,不是吗?@underline\u d,因为我认为我不能很好地解释它,但是如果你坚持-当我放置'\0'而不是重复的字符时,程序会比较下一个字符和最后一个不是重复的字符。然后,她覆盖新字符而不是“\0”,并且这个过程会一次又一次地进行。希望我能澄清一下。嘿,这是意料之中的……你不能这么做。
@coderredoc:对,这就是问题所在。我认为
没有笔直字母
也适用于没有尾随换行符的输入;所以它必须是
是的..这就是为什么。事实上,我的解决方案也适用于此输入。但是现在所有的变化都是次要的(考虑代码< > n>代码>或者不考虑它……嘿,这是意料之中的……你不能做<代码> > CODReDoc:对,这就是问题所在。我认为
没有笔直字母
也适用于没有尾随换行符的输入;所以它必须是
是的..这就是为什么。事实上,我的解决方案也适用于此输入。但是现在所有的变化都是次要的(考虑代码< > n>代码>或者不考虑它)…