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