Удалить дубликат из строки с помощью указателей - PullRequest
1 голос
/ 15 января 2012
#include<stdio.h>
char *removedps(char *x)
{
    int Ar[256] = {0};
    int ip=0;
    int op=0;
    char temp;
    while(*(x+ip))
    {
       temp  = (*(x+ip));
       if (!Ar[temp])  {
         Ar[temp] = 1;
         *(x+ip) = *(x+op);
         op++;
       }
       ip++;
       *(x+op) = '\0';
    }
  return x;
}

int main()
{
  char lo[] = "0001";
  printf("%s",removedps(lo));    
}

Мой код не работает. Я изо всех сил пытался увидеть ошибку. Все, что я получаю, это первый символ.Моя идея проста сделать массив из 256 мест, вставить в них ноль, а затем вставить 1 для каждого символа в строке (в этой позиции массива)

Ответы [ 3 ]

1 голос
/ 15 января 2012

потому что *(x+op) = '\0';

всегда выполняется на каждой итерации цикла.

Я бы, вероятно, сделал это больше так (используя ваш метод, который я, вероятно, не использовал бы лично)

char *removedps(char *x)
{
    int Ar[256] = {0};
    char* start = x;
    while(*x)
    {       
        if (Ar[*x])   
        {  // remove the repeated character 
           memmove(x, x+1, strlen(x));
        }   
        else
        {
            Ar[*x] = 1;
            x++;
        }       
    }
    return start;
}

также, я бы назвал это remove_duplicate_chars или чем-то еще, а не фанатом загадочных сокращений.

1 голос
/ 16 января 2012

Ваше задание выглядит здесь как ошибка.

op is "out postiion", ip "is position"

, поэтому должно быть

*(x+op) = *(x+ip);

не наоборот.

0 голосов
/ 15 января 2012

В конце цикла вы делаете *(x+op)='\0';, а затем, на следующей итерации, вы делаете *(x+ip)=*(x+op);, поэтому из 2-й итерации вы помещаете туда 0.

попробуйте сделать что-токак:

for (op=ip=0;x[ip];ip++) {
 if (!Ar[x[ip]]++) x[op++]=x[ip];
}
x[op]=0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...