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