传递char []参数根本不起作用

时间:2011-10-06 02:45:08

标签: c arrays string function parameters

好的,所以我有一个代码来修剪字符串中的重复字符, 基于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根本没有修剪。如果数组参数是参数参考,那么这种事情怎么会发生在我身上?任何人都有答案?我搜索了很多来源并尝试了这个唯一的问题,但总是失败。感谢您回答或只是发表意见。

4 个答案:

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