strstr Невозможно найти диагональный символ в C

Я хочу заменить строку, но я нахожу проблему, которая не работает, если строка содержит диагональную функцию

 char *str_replace(char *orig, char *rep, char *with) {
      int strlen_orig = strlen(orig);
      int strlen_rep  = strlen(rep);
      int strlen_with = strlen(with);char * tmp;
      if(strlen_orig == 0 || strlen_rep == 0 || strlen_with == 0) return orig;


      tmp = strstr(orig, rep); 
      if(tmp != NULL ){
                strncpy (tmp,with,strlen(with)); printf("ENCONTRO");
      }

      return orig;
}

, которая вызывает

 str_replace(buf,(char*)"</form>",(char*)"</form><h1>ola</h1></form>"));

, если я использую, например,

 str_replace(buf,(char*)"<form>",(char*)"</form><h1>ola</h1></form>"));

работает, большое спасибо.

0
задан 05.01.2017, 21:13
0 ответов

Это не тема, символы убегают, только, что estas переходя вложенные в функцию strstr.

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

int main(void) 
{
    char *Cadena = "</form><h1>hola</h1></form>";
    char *CadenaABuscar = "</form>";

    char *tmp = strstr(Cadena, CadenaABuscar); 
    if(tmp != NULL )
        printf( "Encontrada");
    else
        printf( "No encontrada");

    return 0;
}

Вывод этого примера:

Найденная

В твоем случае, в коде:

tmp = strstr(orig, rep); 

Он не был должен быть...?:

tmp = strstr( with, rep );
0
ответ дан 03.12.2019, 17:51

Ты должен иметь в виду, что ты должен отделять память, так как у нового string будет большая длина в инициала.

Алгоритм, который он осуществляет, отделяет в 3 частях string (часть 1 перед substring; часть 2, substring; part3 после substring). Потом скопируй весь string в другой string, у которого есть конечная длина, после мы ищем этот substring и получаем индекс, после копируем новый substring заменяя предыдущего, после копируем оставшуюся часть.

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

char *str_replace(char *orig, char *rep, char *with) {
    int strlen_orig = strlen(orig);
    int strlen_rep  = strlen(rep);
    int strlen_with = strlen(with);
    if(strlen_orig == 0 || strlen_rep == 0 || strlen_with == 0) return orig;

    int strlen_out = (strlen_orig- strlen_rep + strlen_with);

    char *out = malloc(sizeof(char)*(strlen_out+1));
    out = memcpy(out, orig, strlen_orig);
    char *tmp = strstr(out, rep);
    if(tmp != NULL){
        int start = tmp -out;
        memcpy(&(out[start]), with, strlen_with);
        memcpy(&(out[start + strlen_with]), &(orig[start + strlen_rep]), strlen_orig - start - strlen_rep);
        out[strlen_out+1] = '\0';
        return out;
    }

    return orig;
}

int main()
{
    char *buf = "ppp</form>hhh";
    char *rep = "</form>";
    char *with = "</form><h1>ola</h1></form>";

    char * out = str_replace(buf, rep, with);
    printf("%s\n", buf);
    printf("%s\n", out);
    return 0;
}

Output:

ppp</form>hhh
ppp</form><h1>ola</h1></form>hhh
0
ответ дан 03.12.2019, 17:51