2011-04-16 6 views
1

Ниже приведен код C, который я пытался удалить повторяющийся символ в строке, но он не работает должным образом, он застревает в комментарии застрял. Пожалуйста, помогите мне понять, что я делаю неправильно?Как удалить дубликат из строки в c?

void removeDupliacte(char *str) 
{ 
    int bitset=0; 
    int value= 0; 
    char *tail = str; 
    char temp; 
    int i=0; 
    while(*str) 
    { 
     value = *str - 'a'; 
     if(bitset & (1 << value) > 0) 
     { 
      str++; 
     } 
     else 
     { 
      bitset |= 1 << value; 
      temp = *str; 
      tail[i] =temp; /*stuck*/ 
      i++; 
      str++; 
     } 
    } 
tail[i++] = '\0'; 

} 

int main() 
{ 
    char *str = "abac"; 
    removeDupliacte(str); 
    printf("%s",str); 
    return 0; 
} 
+0

Это: 'if (bitset & (1 <0)' в вашем цикле while не может быть прав. Он всегда будет оценивать значение 0, то есть 'false'. Я посмотрю на остальное, но определенно –

+0

Я думаю, что он, вероятно, должен быть, если ((bitset & (1 << value)) > 0) из-за> с более высоким приоритетом, чем &. –

ответ

3

ул является константной строкой, означая хранится в области, что вы не можете изменить (char *str = "abac";) tail указывает на str, и вы не можете изменить его, а также, tail[i] =temp; попытка написать только для чтения области.

Одним из решений является изменение объявления str на char str[] = "abac";, которое выделит массив размером «abac \ 0» и скопирует в него строку «abac \ 0». Поскольку массивы находятся в памяти чтения-записи (в случае массива в функции - в стеке), вы сможете изменить строку. Как appose to char *str = "abac";, который помещает строку в постоянное запоминающее устройство и назначает указатель на строку str.

+0

почему char * str = "abac ", только для чтения? – Ankur

+0

Потому что вы« рассказываете »компилятор - поместите строку« abac »в сегменте данных и дайте мне свой адрес. Сегмент данных доступен только для чтения. См. также этот ответ: http://stackoverflow.com/questions/2241834/why-is-my-char-writeable-and-when-read-only-in-c – MByD

1

Кроме того, вы должны попытаться изменить ваше, если заявление:

if((bitset & (1 << value)) > 0) 

В противном случае он не делает то, что он должен делать из-за оператором старшинство.

+0

+1 для решения следующей проблемы OP. – MByD

Смежные вопросы