Как удалить повторяющиеся символы, которые повторяются много раз в конце строки на языке Си? - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь научиться работать со строками в 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] != '\0';j++)
    {
        if(reverse_string[j] == reverse_string[i])
        {
            for(int k = j; reverse_string[k] != '\0'; k++)
            {
                //printf("%c\n", reverse_string[k+1]);
                reverse_string[k] = reverse_string[k + 1];
            }                
        }           
    }        
  }
   printf("%s\n", reverse_string);    
return 0;
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вот ваш код.Основной проблемой был j ++.Вы должны оставаться в том же j до тех пор, пока reverse_string [j]! = Reverse_string [i].Вторая проблема заключалась в том, что вы не завершили строку.

#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)] = '\0'; //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] != '\0';) //j++ was moved. 
    {
        if(reverse_string[j] == reverse_string[i])
        {

            for(int k = j; reverse_string[k] != '\0'; 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;
}
0 голосов
/ 28 ноября 2018

В строке ниже, k останется в конце одного и того же символа дважды.если k равно 4, а end равен 5, то 4-й и 5-й символы будут одинаковыми.Одна проблема состоит в том, что когда k имеет нулевой символ, k + 1 заменит нулевой символ.

 reverse_string[k] = reverse_string[k + 1];
...