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;
}
您传递字符串字面,你不能修改这个功能,而应该这样做:
char myStr[] = "heee";
removeDuplicate(myStr);
而且,请注意,下面几行你必须给的printf(%c %d
)内符,但你只传递一个参数(str[j]
):
printf("\nRemoving %c %d -- \n",str[j]);
这可能会导致各种不良事情......
实际上,我打印j也与...这是一个意外的错误...也是什么问题的逻辑? – 2012-03-12 10:43:52
是的,得到了实际的逻辑问题,并改变了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];
第一个循环'j = i'是正确的。 – duedl0r 2012-03-12 10:49:52
我已经改变了错误,并发布为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;
}
请添加一些解释.. – 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/
你可以显示你对这个函数的调用吗? – MByD 2012-03-12 10:34:59
removeDuplicate(“heee”); – 2012-03-12 10:37:12
是的,这是呼叫问题... heee没有\ 0:P ..是它的问题吗? – 2012-03-12 10:39:30