好的,所以我有一个代码来修剪字符串中的重复字符, 基于here。好的,我修改成这样:
void rem_dup(char str[]){
int char_check=0;
int i,j;
char ch;
char filterstr[256]; /* store the temporary strings */
/* check from 1st character in the string */
while(str[char_check]) {
ch = str[char_check];
i = j = char_check+1;
filterstr[0] = str[0]; // added
/* logic to remove the repeated character */
while(str[i]) {
if(str[i] != ch) {
filterstr[j] = str[i]; //modifid
j++;
}
i++;
}
filterstr[j]='\0'; //modified
str = filterstr; //added
char_check++;
}
printf("String after removing duplicates : %s\n",str); this
}
我通过做一个简单的脚本来实现这个
int main(){
char Q[20];
char E[26];
fgets(Q,sizeof(Q),stdin);
fgets(E,sizeof(E),stdin);
rem_dup(Q);
rem_dup(E);
printf("\n%s\n%s\n",Q,E);
return 0;
}
我希望输出就像这样
0101010101
ababababab
String after removing duplicates : 01
String after removing duplicates : ab
01
ab
然而输出将成为这个
0101010101
ababababab
String after removing duplicates : 01
String after removing duplicates : ab
0101010101
ababababab
正如你所看到的,现实是Q和E根本没有修剪。如果数组参数是参数参考,那么这种事情怎么会发生在我身上?任何人都有答案?我搜索了很多来源并尝试了这个唯一的问题,但总是失败。感谢您回答或只是发表意见。
答案 0 :(得分:2)
该行
str = filterstr;
没有做你想做的事。该代码只是将指针的本地副本更改为缓冲区。它不会改变缓冲区的内容。
您需要致电
strcpy(str, filestr);
在函数返回之前,即printf
现在的位置。
看看你的逻辑,我相信它会因更复杂的输入而失败。我不会尝试为您调试它,因为我不能100%确定您希望代码执行的操作。
答案 1 :(得分:0)
str = filterstr;
行使str
(因此,Q
)指向filterstr
。当函数存在时,filterstr
将被销毁,Q
将重新获得其原始值。
答案 2 :(得分:0)
问题是,当您传入指针时,您没有获得对实际对象的引用,而是指向对象的指针的副本,或者这是一个缓冲区。所以当你说
时str = filterstr
它不会更改原始指针或主要指针,而是更改本地副本。这就是为什么你看到函数内部的修剪字符串而不是外部。
此外,由于filterstr也是局部变量,只需更改指针就行了,你需要使用strcpy。
答案 3 :(得分:0)
你可以将整个事情简化为几行,避免像这样的临时存储:
void
rmdups(char *str)
{
char *sp;
for(sp=str; *sp; sp++){
char *lo, *hi;
for(lo=sp, hi=sp+1; *lo; hi++)
if(*hi!=*sp)
*++lo = *hi;
}
}