Передача параметров char [] не работает вообще - PullRequest
2 голосов
/ 06 октября 2011

Хорошо, у меня есть код для обрезки дублирующихся символов в строке, основанный на здесь .Хорошо, я изменил, чтобы стать так:

    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 ]

2 голосов
/ 06 октября 2011

Линия

str = filterstr;

не делает то, что вы есть.Этот код просто изменяет локальную копию указателя на буфер.Он не изменяет содержимое буфера.

Вам нужно вызвать

strcpy(str, filestr);

непосредственно перед возвратом функции, т. Е. Где сейчас находится ваш printf.

Просмотрваша логика, я считаю, что это не удастся для более сложных входных данных.Я не собираюсь пытаться отлаживать его для вас, потому что я не на 100% уверен в том, что вы хотите, чтобы код делал.

0 голосов
/ 06 октября 2011

Вы можете упростить все это до нескольких строк, избегая временного хранения, как это:

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;
     }
}
0 голосов
/ 06 октября 2011

Проблема в том, что когда вы передаете указатель, вы получаете не ссылку на реальный объект, а копию указателя на объект или, в этом случае, буфер. Поэтому, когда вы говорите

str = filterstr

это не меняет оригинальный указатель или указатель в основном, но локальную копию. Вот почему вы видите обрезанную строку внутри функции, а не снаружи.

Кроме того, так как filterstr также является локальной переменной, простое изменение указателей не сработает, вам нужно использовать strcpy.

0 голосов
/ 06 октября 2011

Строка str = filterstr; указывает str (и, следовательно, Q) на filterstr. Когда функция существует, filterstr уничтожается и Q восстанавливает свое первоначальное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...