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. Вызов функции правильный, на ваш взгляд ?