Помогите с функцией.Замена строки в подстроке.

gera3323
Дата: 22.09.2014 18:50:56
char *str_replace( char *str, char *key, char *value )
{
    int len_str = strlen( str ) + 1 - strlen( key ) + strlen( value ) + 1;
 
    char *buf = NULL;
 
    buf = (char*)realloc( buf, len_str );
 
    register char *q  =  str,   *k  =  key, 
                  *v  =  value, *b  =  buf;
 
    while( *b++ = *q++ ) {
       if( *q != *k ) {
            continue;
       }
       for( ;; ) {
         if( *k == 0 ) {
            while(*b = *v++ ) {
                *b++; 
            }
            break;
         };
 
         if(*q++ != *k++) { 
             q -= 2;
             break;
         }
       };
 
       k = key;
    };
 
    *b = '\0';
 
    return buf;
};
 
 
void main()
{
    char *text = "SELECT * FROM list.authdata WHERE usrpas = :SEEEE AND usrlog = :PK";
 
    text = str_replace( text, ":IEEEEEEEEEED", "222" );
    text = str_replace( text, ":PK", "333333" );
 
    cout<<text<<endl;
}


1. При каких условиях функция может дать не правильный результат ?
2. Можно ли сделать функцию более быстрее ?
функция будет использоватся в подстановке параметров в скл запросе.
MasterZiv
Дата: 22.09.2014 18:53:46
gera3323,

Очевидный недостаток -- она заменяет key только один раз.
gera3323
Дата: 22.09.2014 18:56:10
MasterZiv, ок. вложу ее в рекурсивную функцию.
NekZ
Дата: 22.09.2014 18:56:54
gera3323,

Есть более простая реализация.
std::string replaceString( std::string subject, std::string const & search, std::string const & replace ) {
   size_t pos = 0;
   while ( ( pos = subject.find( search, pos ) ) != std::string::npos ) {
       subject.replace( pos, search.length(), replace );
       pos += replace.length();
   }
   return subject;
}
gera3323
Дата: 22.09.2014 18:59:08
NekZ
gera3323,

Есть более простая реализация.


и чем же она лучше ? тем что она стала на пару строк короче....
NekZ
Дата: 22.09.2014 19:18:21
gera3323,

Выбор за Вами. Учитывая, что в С++, принято использовать std::string, вместо char * для различных строковых операций, дабы не портить себе настроение при написании кода ;-)
MasterZiv
Дата: 22.09.2014 19:43:12
gera3323
MasterZiv, ок. вложу ее в рекурсивную функцию.


Ага, и рекурсивно будешь память выделять ?

Ну-ну...

Выделение памяти -- достаточно дорогая операция.
gera3323
Дата: 22.09.2014 20:06:47
MasterZiv
нет. память будет выделена раньше. к примеру в main
SashaMercury
Дата: 23.09.2014 02:16:48
Я так понял, что вы считаете что она работает, раз спрашиваете
gera3323
1. При каких условиях функция может дать не правильный результат ?


gera3323, а вы уверены что ваша функция работает ?
SashaMercury
Дата: 23.09.2014 02:38:53
1.
int len_str = strlen( str ) + 1 - strlen( key ) + strlen( value ) + 1;


Зачем вы просите памяти на 1 больше чем нужно ?

2.
 char *buf = NULL;
 
    buf = (char*)realloc( buf, len_str );


почему не выделяете память в одну строку через malloc ?

3. Зачем вы ставите ; после окончания блоков операторов ?

4. Покажите квалификаторами ваше отношение к входным параметрам. Какие из них меняются функцией, а какие нет.

5. Самый важный вопрос. Что на ваш взгляд должна делать эта функция ?

6. Вы делали её самостоятельно ?

7. Вызов функции правильный, на ваш взгляд ?