2015-03-16 4 views
0

Я пишу код, чтобы удалить повторяющееся появление символа в строке.Повторяющийся символ в строке

Описание: -Удалить повторяющиеся символы из строки

Пример: -

Пример входных = abcdeabd

Пример вывода = ABCDE

Я написал код и он работает, и когда я тестировал, выполнив тестовые образцы, это проходит большинство тестов, но не удается некоторые, например, когда я использую строку ввода, как «abcdabcdabcdabcd» Это дает мне abcdd как выход вместо «ABCD»

Вот мой код

#include<stdio.h> 

int main(void) 
{ 

     char a[60]="abcdeabd"; 
     int n=0; 
     for(int l=0;a[l]!='\0';++l) 
      ++n; 
     printf("%d\n",--n); 
     for(int i=0;i<=n;++i) 
     { 
      for(int j=i+1;j<=n;++j) 
      { 
       if(a[i]==a[j]) 
       { 
        for(int k=j;k<=n;++k) 
         a[k]=a[k+1]; 
        --n; 

       }  
      }  
     } 
     puts(a); 
    return 0;  
} 

Пожалуйста, скажите мне, где я неправильно с этим кодом. ..?

+1

может не вы-то, что у вас есть, чтобы избежать два для петель? –

+0

Что вы просите меня сделать именно так? – Patel

+2

Без чтения кода я думаю, что вы не смогли удалить последний символ, если он повторен. – idstam

ответ

3

Логика ошибки в блоке

if(a[i]==a[j]) 
{ 
    for(int k=j;k<=n;++k) 
     a[k]=a[k+1]; 
    --n; 
}  

Это не работает, когда у вас есть такой же характер, более чем в два раза подряд. Он не работает для «addd» или «adddbc».

Измените это на цикл while, чтобы устранить проблему.

while (a[i] == a[j]) 
{ 
    for(int k=j;k<=n;++k) 
     a[k]=a[k+1]; 
    --n; 
}  
+0

R sahu Спасибо, человек тон, U просто пришел как мессия и спас меня от неприятностей :) Спасибо тонну – Patel

1

Что касается меня, я бы написал соответствующую функцию с помощью указателей. Например

#include <stdio.h> 

char * unique(char *s) 
{ 
    char *last = s, *current = s; 

    do 
    { 
     char *t = s; 
     while (t != last && *t != *current) ++t; 
     if (t == last) 
     { 
      if (last != current) *last = *current; 
      ++last; 
     } 
    } while (*current++); 

    return s; 
} 

int main(void) 
{ 
    char s[]="abcdeabd"; 

    puts(s); 
    puts(unique(s)); 

    return 0; 
} 

Выход

abcdeabd 
abcde 

Что касается кода, то я бы переписать его следующим образом принять во внимание, что вы должны скопировать и завершающий ноль.

#include <stdio.h> 

char *unique(char *s) 
{ 
    int n = 0; 

    while (s[n++] != '\0'); 

    printf("%d\n", n); 

    for (int i = 0; i < n; ++i) 
    { 
     for (int j = i + 1; j < n; ++j) 
     { 
      if (s[i] == s[j]) 
      { 
       --n; 
       for (int k = j; k < n; ++k) s[k] = s[k+1]; 
      }  
     }  
    } 

    return s; 
} 


int main(void) 
{ 
    char s[]="abcdeabd"; 

    puts(s); 
    puts(unique(s)); 

    return 0; 
} 
+0

Но не могу ли какие-то изменения, внесенные мной в код выше, только для того, чтобы он работал ...? – Patel

0
#include<stdio.h> 
int main(void) 
{ 
char a[10]="abcdeabd"; 
for(int i=0;a[i]!='\0';++i) 
       printf("\n %c", a[i]); 

for(i=0;a[i]!='\0';++i) 
    for(int j=i+1;a[j]!='\0';++j) 
     if(a[i]==a[j]) 
      for(int k=j;a[k]!='\0';++k) 
        a[k]=a[k+1]; 
puts(a); 
return 0; 
} 
+0

@Patel: Ваш «n» уменьшает массив на 1 для обоих, то есть i, а также j. – user388229

+0

Что! Что случилось..? – user388229

+0

Возникла проблема с приведенным выше кодом –

0

@Patel: Ваша программа правильно. Вы пропустили только одну вещь. Когда вы использовали printf(), вы уменьшаете значение n.

Так поставить линию, чтобы увеличить его после Printf()

++i; 
Смежные вопросы