我的程序必须查找重复的字符(一个接一个地出现)并删除它们。所以我的程序确实有效,但是如果我放“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);
}
我找到了原因,但是当我修复它时,屏幕上什么都没有。
问题是
myString[length] = '\0';
这将是
myString[++j] = '\0';
这是有效的,因为在循环结束时j
指向最后一个有效字符。然后,如果你增加它并将\0
放在那里 - 它将成为字符串。
您可以模拟使用\n
这一小额外添加的行为(不太可能需要)。
myString[++j]='\n';
myString[++j]=0;
此外,作为一个小修改,您可以删除代码中的冗余分配。这是不必要的。
if (myString[j] == myString[i])
{
myString[i] = '\0';
}
有两个问题:
首先,你错过了最后一个角色;你可能没有注意到它,因为你的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);
}