Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2014, 10:11   #1
yans
 
Регистрация: 06.11.2014
Сообщений: 9
Вопрос C - замена символов. В чем проблема?

Сделал функцию замены:

Код:
#include <stdio.h>
#include <string.h>
 
char* replace_str(char* str, char* search, char* replace) {
    char *searchPos;
    int i, j;
    static char buffer[4096];
    int n = 0;
    while(1) {
        n++;
printf("\nSTR=\"%s\"\n",str);
printf("%i\n",strlen(str));
        if(!(searchPos = strstr(str, search)))
            return str;
        char *dst = malloc(strlen(str) - strlen(search) + strlen(replace)) ;
printf("\nSTR=\"%s\"\n",str);
printf("%i\n",strlen(str));
        for (i=0, j=0; i <= strlen(str) - strlen(searchPos)-1; i++) {
           dst [j++] = str [i];
        }
        dst=strcat(dst,replace);
        for (i=strlen (str) - strlen (searchPos) + 1 ,j=j+strlen(replace); i <= strlen(str) - strlen(search) + strlen(replace); i++) {
           dst [j++] = str [i];
        }
        str=dst;
printf("\n%i: RESULT=\"%s\"\n============\n",n,str);
    }
return str;
}
 
int main(void) {
    char* mystring;
    mystring="Startaaabbb cccaaa ggg[aa]";
    replace_str(mystring, "a", "XXX");
    return 0;
}
Все меняет, есть одно но, на 6й итерации вдруг после команды:
Код:
char *dst = malloc(strlen(str) - strlen(search) + strlen(replace)) ;
меняется строка str (в конце добавляется символ 1) и ее длинна увеличивается на одну, подскажите в чем может быть дело?

Вывод программы:
Код:
.......
.......
.......
STR="StXXXrtXXXXXXXXXbbb cccXXXaa ggg[aa]"
36
 
STR="StXXXrtXXXXXXXXXbbb cccXXXaa ggg[aa]1"
37
 
6: RESULT="StXXXrtXXXXXXXXXbbb cccXXXXXXa ggg[aa]1"
.......
.......
.......
В чем пожет быть проблема?

Делаю под linux, компилятор gcc
yans вне форума Ответить с цитированием
Старый 28.11.2014, 10:25   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

В том, что вы забываете про терминантный 0 в конце новой строки.
p51x вне форума Ответить с цитированием
Старый 28.11.2014, 10:39   #3
yans
 
Регистрация: 06.11.2014
Сообщений: 9
По умолчанию

Подскажите пожалуйста подробней. Или ткните в ссылку где про это можно прочитать.
yans вне форума Ответить с цитированием
Старый 28.11.2014, 11:45   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

В любой книжке по С.
В С строки обычно 0-терминантные, т.е. строка "АААА", на самом деле хранится как "АААА\0". strlen возвращает длину строки без учета терминантного 0.
И когда вы пишите
Код:
char *dst = malloc(strlen(str)) ;
а потом копируете туда str, то \0 будет писаться за границы.

Есть и другой эффект, если \0 в конце не нашелся, то некоторые функции пойдут дальше по памяти до \0 или пока не наткнутся на исключение.
p51x вне форума Ответить с цитированием
Старый 28.11.2014, 12:29   #5
yans
 
Регистрация: 06.11.2014
Сообщений: 9
По умолчанию

Спасибо, разобрался
yans вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена символов Alexandr- Помощь студентам 1 09.04.2013 15:36
замена символов nub' Общие вопросы по Java, Java SE, Kotlin 0 09.03.2012 13:01
замена символов sveta11115 Общие вопросы C/C++ 11 21.03.2010 10:56
c++ замена символов sveta11115 Помощь студентам 0 21.03.2010 00:09
Замена символов PAVEL315 Общие вопросы Delphi 1 03.02.2007 21:56