@apomyrma

Почему не работает функция замены слова (с учетом массива-разделителя)?

Задача:
Есть строка; массив разделителей; слово, которое нужно заменить; слово, на которое нужно заменить.

Как должна работать:
Если в строке символ-разделитель - переносим его в буффер. Если нет, то сравниваем лексему: если лексема та, которую нужно заменить, то переносим в буффер заданное слово, иначе переносим лексему.

void replace(char str[], char a[], char b[], char buffer1[],char buffer2[], char sep[]) //(в том же порядке):строка, слово на поиск, слово на замену, буфер, массив разделителей
{
    int i, sep_pos = 0, str_pos = 0, buff_pos = 0;
 
    int sep_found = 0;
    int word_start = 1;
    char *token;
 
    memset(buffer1, 0, sizeof(buffer1));
    memset(buffer2, 0, sizeof(buffer2));
    
    strcpy(buffer2, str);
    token = strtok(buffer2, sep);
    while(token != NULL)
    {       
        for(str_pos=0; str[str_pos]; )
        {
            sep_found=0;
            for(sep_pos=0; sep[sep_pos]; sep_pos++)     
                if (str[str_pos]==sep[sep_pos])
                {
                    buffer1[buff_pos++] = str[str_pos++];
                    sep_found=1;
                    break;
                }
            if(!sep_found)
            {
                if(strcmp(token,a) == 0) // <--------------- !!!
                {
                    strcat(buffer1,b);
                    buff_pos += strlen(b);
                    str_pos += strlen(token);
                    break;
                }
                if(strcmp(token,a) != 0)
                {
                    strcat(buffer1,token);
                    buff_pos += strlen(token);
                    str_pos += strlen(token);
                    break;
                }
                token = strtok(NULL,sep);
            }       
        }
    
    }
    str = (char*)realloc(str, strlen(buffer1)*sizeof(char)); //избавились от переполнения (на всякий)
 
    strcpy(str,buffer1);
    
}


Пошаговое выполнение говорит, что ошибка начинается в (помечено комментарием)

Пример работы:
Массив разделителей: 123
Строка: а1ааа1а
Слово на поиск: а
Слово на замену: c
Результат: с1ааа1с

Пожалуйста, сильно не ругайтесь, программирую чуть больше месяца. С ошибкой совсем не могу разобраться.
  • Вопрос задан
  • 269 просмотров
Пригласить эксперта
Ответы на вопрос 1
@MiiNiPaa
Пока разбирать код времени не было, но в самом начале грубая ошибка:memset(buffer1, 0, sizeof(buffer1));

sizeof(buffer1) вернёт 4 или 8 в зависимости от архитектуры приложения, так как тип buffer1 — char*. При передаче массива в функцию данные о его конкретном типе теряются (Это одна из причин, почему массивы в С++ использовать не рекомендуется)

Из-за этого strcat может отработать некорректно.

(Кстати, пример работы это же как должно быть, правильно?)

EDIT: В вашем случае использование strtok неоправдано, посмотрите в сторону strpbrk и strcspn/strspn

Плюс ваша "защита от переполнения" выделяет слишком маленький буфер. В результате конечный 0 не копируется (не говоря о том, что она ни от чего не защищает и ограничивает возможности использования функции)

Добавьте больше информации об ошибке. Что происходит?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы