C语言如何去除字符串末尾重复多次的重复字符?
How to remove duplicate characters that repeats many times at the end of a string in C language?
我正在尝试学习如何在 C 中使用字符串,但我遇到了这个问题,我需要反转一个字符串并在没有任何重复字符的情况下打印它。我已经尝试了下面的代码并且它有效但是如果我添加许多相同类型的重复字符它不起作用。
例如:dodon - nodod - nod 但使用字符串 dodoneeee - eeeenodod - eenod。 e还是重复
代码如下:
#include <stdio.h>
#include <string.h>
int main(){
char word[20];
char reverse_string[20];
printf("type a string: ");
scanf("\n%s", word);
for(int i = strlen(word)-1; i>=0; i--)
{
// 5 - 5 = 0
// 5- 4 = 1
// 5- 3 = 2
// 5- 2 = 3
// 5- 1 = 4
// 5- 0 = 5
reverse_string[(strlen(word)-1)-i] = word[i];
}
printf("%s\n",reverse_string);
for(int i = 0; i< strlen(reverse_string)-1;i++)
{
for(int j = i+1; reverse_string[j] != '[=10=]';j++)
{
if(reverse_string[j] == reverse_string[i])
{
for(int k = j; reverse_string[k] != '[=10=]'; k++)
{
//printf("%c\n", reverse_string[k+1]);
reverse_string[k] = reverse_string[k + 1];
}
}
}
}
printf("%s\n", reverse_string);
return 0;
}
在下一行中,k 将两次停留在同一个字符的末尾。如果 k 为 4 且 end 为 5,则第 4 个和第 5 个字符将相同。一个问题是当 k 为空字符时,k + 1 将覆盖空字符。
reverse_string[k] = reverse_string[k + 1];
这是您的代码。
主要问题是j++。在 reverse_string[j] != reverse_string[i] 之前,您必须保持相同的 j。
第二个问题是你没有终止字符串。
#include <stdio.h>
#include <string.h>
int main()
{
char word[20];
char reverse_string[20];
printf("type a string: ");
scanf("%s", word);
for(int i = strlen(word)-1; i>=0; i--)
{
// 5 - 5 = 0
// 5- 4 = 1
// 5- 3 = 2
// 5- 2 = 3
// 5- 1 = 4
// 5- 0 = 5
reverse_string[(strlen(word)-1)-i] = word[i];
}
reverse_string[strlen(word)] = '[=10=]'; //add string termination
printf("%s\n",reverse_string);
for(int i = 0; i< strlen(reverse_string)-1;i++)
{
for(int j = i+1; reverse_string[j] != '[=10=]';) //j++ was moved.
{
if(reverse_string[j] == reverse_string[i])
{
for(int k = j; reverse_string[k] != '[=10=]'; k++)
{
//printf("%c\n", reverse_string[k+1]);
reverse_string[k] = reverse_string[k + 1];
}
}
else
j++; //j++ was moved here
}
}
printf("%s\n", reverse_string);
return 0;
}
我正在尝试学习如何在 C 中使用字符串,但我遇到了这个问题,我需要反转一个字符串并在没有任何重复字符的情况下打印它。我已经尝试了下面的代码并且它有效但是如果我添加许多相同类型的重复字符它不起作用。
例如:dodon - nodod - nod 但使用字符串 dodoneeee - eeeenodod - eenod。 e还是重复
代码如下:
#include <stdio.h>
#include <string.h>
int main(){
char word[20];
char reverse_string[20];
printf("type a string: ");
scanf("\n%s", word);
for(int i = strlen(word)-1; i>=0; i--)
{
// 5 - 5 = 0
// 5- 4 = 1
// 5- 3 = 2
// 5- 2 = 3
// 5- 1 = 4
// 5- 0 = 5
reverse_string[(strlen(word)-1)-i] = word[i];
}
printf("%s\n",reverse_string);
for(int i = 0; i< strlen(reverse_string)-1;i++)
{
for(int j = i+1; reverse_string[j] != '[=10=]';j++)
{
if(reverse_string[j] == reverse_string[i])
{
for(int k = j; reverse_string[k] != '[=10=]'; k++)
{
//printf("%c\n", reverse_string[k+1]);
reverse_string[k] = reverse_string[k + 1];
}
}
}
}
printf("%s\n", reverse_string);
return 0;
}
在下一行中,k 将两次停留在同一个字符的末尾。如果 k 为 4 且 end 为 5,则第 4 个和第 5 个字符将相同。一个问题是当 k 为空字符时,k + 1 将覆盖空字符。
reverse_string[k] = reverse_string[k + 1];
这是您的代码。 主要问题是j++。在 reverse_string[j] != reverse_string[i] 之前,您必须保持相同的 j。 第二个问题是你没有终止字符串。
#include <stdio.h>
#include <string.h>
int main()
{
char word[20];
char reverse_string[20];
printf("type a string: ");
scanf("%s", word);
for(int i = strlen(word)-1; i>=0; i--)
{
// 5 - 5 = 0
// 5- 4 = 1
// 5- 3 = 2
// 5- 2 = 3
// 5- 1 = 4
// 5- 0 = 5
reverse_string[(strlen(word)-1)-i] = word[i];
}
reverse_string[strlen(word)] = '[=10=]'; //add string termination
printf("%s\n",reverse_string);
for(int i = 0; i< strlen(reverse_string)-1;i++)
{
for(int j = i+1; reverse_string[j] != '[=10=]';) //j++ was moved.
{
if(reverse_string[j] == reverse_string[i])
{
for(int k = j; reverse_string[k] != '[=10=]'; k++)
{
//printf("%c\n", reverse_string[k+1]);
reverse_string[k] = reverse_string[k + 1];
}
}
else
j++; //j++ was moved here
}
}
printf("%s\n", reverse_string);
return 0;
}