C программа для удаления повторяющихся символов в строке ... Показывает ошибку во время выполнения - PullRequest
0 голосов
/ 12 марта 2012

Я написал следующую функцию для удаления повторяющихся символов из строки. Например: if str = "heeello; removeDuplicate (str)

вернет helo ... Но во время выполнения он показывает некоторую ошибку.Я добавил несколько операторов printf () для отладки ... Кто-нибудь может сказать мне, в чем проблема?

char* removeDuplicate(char str[])//remove duplicate characters from a string,so that each character in                a string is not repeating  
{
    int i = 0,j;
    char ch;
    printf("\nstr is %s",str);
    while((ch = str[i++] )!= '\0')
    {
    j = i;
    printf("\n----ch = %c----",ch);
    while(str[j] != '\0')
    {
        printf("\n--------Checking whether %c =  %c \n",str[j],ch);
        if(ch == str[j])
        {
            printf("\n------------Yes");
            while(str[j]!='\0')
            { 
                printf("\nRemoving %c %d -- \n",str[j]);
                str[j] = str[++j];
                --i;

            }

            break;
        }
        printf("\n------------No");

       //printf("\njj");
        j++;
    }
}

return str;
}

Ответы [ 8 ]

2 голосов
/ 12 марта 2012

Вы должны исправить свой код следующим образом:

  In first while loop:  j = i+1;
  In third while loop: i--; // is not required
  Remove that unwanted specifier form printf("Removing %d %d:",str[j])

  Doing incorrectly :
  str[j] = str[++j] // you are increasing j before assigning
  str[j] = str[j++] // correct way to do.But it is compiler dependent i guess

  Better to use:
    t = j;
    str[t] = str[++j];
2 голосов
/ 12 марта 2012

Вы передаете строковый литерал, который вы не можете изменять в этой функции, вместо этого вы должны сделать:

char myStr[] = "heee";
removeDuplicate(myStr);

Также обратите внимание, что в следующих строках вы должны указывать спецификаторы внутри printf (%c %d), но передаете только один аргумент (str[j]):

printf("\nRemoving %c %d -- \n",str[j]);

Это может привести к разным неприятностям ...

1 голос
/ 15 августа 2013
//removing the redundant characters in a string
#include<stdio.h>
int main()
{
 int  i=0,j,arr[26]={},temp;     //array for hashing
 char  s[10],arr1[10],*p;      //array 4 storing d output string
 printf("Enter the string\n");
 scanf("%s",s);
 p=s;
 while(*p!='\0')
 {
     temp=((*p)>92)?(*p)-'a':(*p)-'A';  //asuming lowr and upr letters are same 
    if(arr[temp]==0)              //if it is not hashed ie if that char is not repeated
    {
     arr1[i]=temp+'a';              //return the string in lowecase
     arr[temp]=1;          //storing value so that this character sd not be placed again
     i++;
    }
    p++;                          //else ignore the alphabet
 }
 for(j=0;j<i;j++)
   {
    printf("%c",arr1[j]);          //print the string stored in arr1
   }
 return 0;
 }
1 голос
/ 12 марта 2012

Проверьте следующий код:

char* removeDuplicate(char str[])//remove duplicate characters from a string,so that each character in                a string is not repeating  
{
int i = 0,j;
char ch;
int repIndex=0;
int temp=0;
printf("\nstr is %s",str);
while((ch = str[i++] )!= '\0')
{
j = i;
printf("\n----ch = %c----",ch);
while(str[j] != '\0')
{
    printf("\n--------Checking whether %c =  %c \n",str[j],ch);
    repIndex = j;
    if(ch == str[repIndex])
    {
        printf("\n------------Yes");
        while(str[repIndex]!='\0')
        {
            printf("\nRemoving %c %d \n",str[j]);
            temp = repIndex;
            str[temp] = str[++repIndex];

        }

    } else { j++; }

    }
}

return str;
}


int main ( int argc, char ** argv)
{

    char myStr[]="asdfhelllasdfloofdoeohz";

    printf ("OUtput is : %s \n", removeDuplicate(myStr)  );
}
1 голос
/ 12 марта 2012

Я не думаю, что эта функция делает то, что вы хотите.Цикл удаления действительно подозрительный ... вы уменьшаете i, что выглядит неправильно ... и вы увеличиваете j, что, вероятно, также неправильно:

while(str[j]!='\0')
{ 
  printf("\nRemoving %c %d -- \n",str[j]);
  str[j] = str[++j]; // now the new character is at location j, but since
  // you incremented j you can't access it anymore
  --i; // why is i dependent on the remove stuff?
}

Я бы пошел по более простому подходу.Создайте большой массив bool.Проходите по вашей строке и сохраняйте, встречали ли вы уже текущий символ или нет.Если нет, распечатайте его.

0 голосов
/ 26 декабря 2014

O (n) сложность

char *removeDuplicates(char *str){
    int hash[256]        =  {0};
    int currentIndex     = 0;
    int lastUniqueIndex  = 0;
    while(*(str+currentIndex)){
        char temp = *(str+currentIndex);
        if(0 == hash[temp]){
            hash[temp] = 1;
            *(str+lastUniqueIndex) = temp;
            lastUniqueIndex++;
        }
        currentIndex++;
    }
    *(str+lastUniqueIndex) = '\0';
    return str;
}

См .: http://www.geeksforgeeks.org/remove-all-duplicates-from-the-input-string/

0 голосов
/ 16 августа 2014
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
void main()
{
clrscr();
char *str;
int count=0;
cout<<"enter the string which have repetative characters"<<endl;
cin>>str;
char *str2;
int m=0;
for(int i=0;i<=strlen(str);i++)
{
char ch=str[i];

if(i==0)
{
str2[m]=str[i];
m++;
}
for(int j=0;j<=strlen(str2);j++)
{
if(ch==str2[j])
count++;
}
if(count==0)
{
str2[m]=str[i];
m++;
}
count=0;
if(i==strlen(str))
str2[m]='\0';
}

puts(str2);
getch();
}
0 голосов
/ 12 марта 2012

Я исправил код следующим образом

char* removeDuplicate(char str[])//remove duplicate characters from a string,so that each character in a string is not repeating
{
    int i = 0,j;
    char ch;
    while((ch = str[i++] )!= '\0')
    {
        j = i;
        while(str[j] != '\0')
        {
            if(ch == str[j])
            {
                while(str[j]!='\0')
                str[j] = str[++j];
                 i--;
                break;
            }
            j++;
        }
    }
   return str;
}
...