Ошибка шины при использовании memmove

Возможный дубликат:
устранение неполадок при ошибках шины

Чтобы удалить дубликаты из строки, это программа, которую я написал:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void remDup(char str[])
{
    int i=0,len;
int arr[256]={[0 ... 255] = 0};

while(str[i]!='\0')
{   
    len=strlen(str);
    if(arr[str[i]]==1)
    {
        memmove(str+i,str+i+1,len);
    }
    else
        arr[str[i]]=1;
    i++;
}

printf("String with Unique Characters:%s\n",str);

}

main()
{
remDup("kjijhgfedcaba");
}

Но ошибка, отображаемая при запуске программы: Ошибка шины: 10

Какие изменения нужно внести в код? заранее спасибо


person segmentation_fault    schedule 27.10.2012    source источник
comment
Вопрос дублируется, но я также предлагаю вам попытаться найти менее тяжелый алгоритм. Этот очень дорогой.   -  person fvu    schedule 27.10.2012
comment
@fvu Могу ли я узнать, почему это тяжело? (Я новичок в кодировании)   -  person segmentation_fault    schedule 27.10.2012
comment
На самом деле вопрос заключался в том, чтобы сделать это в O (1) пространстве и O (n) временной сложности.   -  person segmentation_fault    schedule 27.10.2012
comment
На каждой итерации вы выполняете strlen и, возможно, memmove, тогда как цикла по отдельным символам строки будет достаточно.   -  person fvu    schedule 27.10.2012


Ответы (2)


"kjijhgfedcaba" — это строковый литерал, и вы не можете изменить строковый литерал в C.

Кстати, если вы хотите инициализировать все элементы arr в 0 вместо этого (который является расширением GNU):

int arr[256]={[0 ... 255] = 0};

вы можете просто сделать это:

int arr[256]= {0};
person ouah    schedule 27.10.2012
comment
+1, не смотрел вызов. Разве он не должен жаловаться во время компиляции? - person Michael Krelin - hacker; 27.10.2012
comment
@MichaelKrelin-hacker нет, изменение строкового литерала - это неопределенное поведение, и C не требует диагностики при вызове неопределенного поведения. Но компилятор может сделать это, если заметит. - person ouah; 27.10.2012
comment
Я имел в виду при передаче строкового литерала как неконстантного массива символов? В простом c есть концепция const, не так ли? - person Michael Krelin - hacker; 27.10.2012
comment
@MichaelKrelin-hacker по историческим причинам строковые литералы имеют тип char [N], а не const char [N], поэтому диагностика при вызове функции не требуется. - person ouah; 27.10.2012
comment
ах. Это верно только для простого c? - person Michael Krelin - hacker; 27.10.2012
comment
@MichaelKrelin-hacker В C ++ все по-другому, в C ++ тип строковых литералов - const char [N], поэтому компилятор должен выдать диагностику. - person ouah; 27.10.2012
comment
Да, это то, что я имел в виду. Спасибо. - person Michael Krelin - hacker; 27.10.2012
comment
@Майкл Крелин Спасибо. Это работает после внесения этого изменения в основную функцию: char a[]={kjijhgfedcaba}; remDup(а); - person segmentation_fault; 27.10.2012
comment
@MaheshOstwal, я рад, но за это изменение спасибо ouah ;-) - person Michael Krelin - hacker; 27.10.2012

Попробуйте len-i для размера перемещаемой памяти. Вы определенно перемещаете память, которая вам не принадлежит. (тем не менее, я действительно не читал код).

person Michael Krelin - hacker    schedule 27.10.2012
comment
Да, это был один из багов. Спасибо - person segmentation_fault; 27.10.2012