потому что *(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 или чем-то еще, а не фанатом загадочных сокращений.