C程序...显示运行时错误

问题描述:

我写了下面的函数用于从string..For前删除重复的字符:如果 海峡=“heeello; removeDuplicate(STR)C程序...显示运行时错误

将返回直升机...但它显示了运行时的一些错误。我增加了一些的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; 
} 
+0

你可以显示你对这个函数的调用吗? – MByD 2012-03-12 10:34:59

+0

removeDuplicate(“heee”); – 2012-03-12 10:37:12

+0

是的,这是呼叫问题... heee没有\ 0:P ..是它的问题吗? – 2012-03-12 10:39:30

您传递字符串字面,你不能修改这个功能,而应该这样做:

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

而且,请注意,下面几行你必须给的printf(%c %d)内符,但你只传递一个参数(str[j]):

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

这可能会导致各种不良事情......

+0

实际上,我打印j也与...这是一个意外的错误...也是什么问题的逻辑? – 2012-03-12 10:43:52

+0

是的,得到了​​实际的逻辑问题,并改变了while循环为 while(str [j]!(str [j]!='\ 0') if(ch == str [j]) while(str [j]!='\ 0') str [j] = str [++ j];我 - ; 休息; } j ++; } – 2012-03-12 10:47:23

你应该纠正你的代码如下:

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

第一个循环'j = i'是正确的。 – duedl0r 2012-03-12 10:49:52

+0

我已经改变了错误,并发布为Binyamin Sharet的回答评论看到.. – 2012-03-12 14:18:53

我不认为牛逼他的功能是做你想做的。删除循环真的有鬼..你递减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? 
} 

我会去一个更简单的方法。创建一个大布尔数组。循环访问字符串并存储您是否已经遇到当前字符。如果不是,打印它。

检查以下代码:

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

我已校正代码如下

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

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

请添加一些解释.. – Shivaay 2013-08-15 14:16:35

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

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/