C program for removing duplicate characters in a string…Shows run time error

拟墨画扇 提交于 2019-12-25 01:37:26

问题


I wrote the following function for removing duplicate characters from a string..For ex: if str = "heeello; removeDuplicate(str)

will return helo...But it shows some error on runtime .I have added some printf() statements for debugging...Can anyone tell me what the problem is ?

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;
}

回答1:


You are passing a string literal, which you are not allowed to modify to this function, instead you should do:

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

Also, please note that in the following lines your have to specifiers inside the printf (%c %d), but you pass only one argument (str[j]):

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

This may cause all sorts of bad things...




回答2:


You should correct your code as follows:

  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];



回答3:


I don't think this function does what you want. The remove loop is really fishy.. you decrement i which looks wrong.. and you increment j which is probably also wrong:

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?
}

I would go for a simpler approach. Create a large bool array. Loop through your string and store whether you already encountered the current character or not. If not, print it.




回答4:


Check the following code :

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)  );
}



回答5:


//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;
 }



回答6:


I have corrected the code as follows

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;
}



回答7:


#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();
}



回答8:


O(n) complexity

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;
}

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



来源:https://stackoverflow.com/questions/9665425/c-program-for-removing-duplicate-characters-in-a-string-shows-run-time-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!