Quale funzione è sostituire una sottostringa da una stringa in C?


94

Data una char *stringa ( ), voglio trovare tutte le occorrenze di una sottostringa e sostituirle con una stringa alternativa. Non vedo alcuna funzione semplice che ottenga ciò in <string.h>.


4
dubito che tu possa farlo in modo mutevole
user44511

Risposte:


87

L'ottimizzatore dovrebbe eliminare la maggior parte delle variabili locali. Il puntatore tmp è lì per assicurarsi che strcpy non debba camminare sulla stringa per trovare il null. tmp punta alla fine del risultato dopo ogni chiamata. (Vedi l'algoritmo di Shlemiel del pittore per scoprire perché strcpy può essere fastidioso.)

// You must free the result if result is non-NULL.
char *str_replace(char *orig, char *rep, char *with) {
    char *result; // the return string
    char *ins;    // the next insert point
    char *tmp;    // varies
    int len_rep;  // length of rep (the string to remove)
    int len_with; // length of with (the string to replace rep with)
    int len_front; // distance between rep and end of last rep
    int count;    // number of replacements

    // sanity checks and initialization
    if (!orig || !rep)
        return NULL;
    len_rep = strlen(rep);
    if (len_rep == 0)
        return NULL; // empty rep causes infinite loop during count
    if (!with)
        with = "";
    len_with = strlen(with);

    // count the number of replacements needed
    ins = orig;
    for (count = 0; tmp = strstr(ins, rep); ++count) {
        ins = tmp + len_rep;
    }

    tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1);

    if (!result)
        return NULL;

    // first time through the loop, all the variable are set correctly
    // from here on,
    //    tmp points to the end of the result string
    //    ins points to the next occurrence of rep in orig
    //    orig points to the remainder of orig after "end of rep"
    while (count--) {
        ins = strstr(orig, rep);
        len_front = ins - orig;
        tmp = strncpy(tmp, orig, len_front) + len_front;
        tmp = strcpy(tmp, with) + len_with;
        orig += len_front + len_rep; // move to next "end of rep"
    }
    strcpy(tmp, orig);
    return result;
}

@jmucchiello: usa size_tinvece di intper dimensioni arbitrarie di oggetti / stringhe e indici in essi. Inoltre, qual è lo scopo strcpy(tmp, orig);alla fine? Sembra sbagliato.
Alexey Frunze

@Alex, l'ultimo strcpy (tmp, orig) copia l'ultima parte della stringa nella destinazione. Ad esempio: sostituire ("abab", "a", "c") alla fine del ciclo, il risultato contiene, "cbc" e orig punta all'ultima "b" in "abab". L'ultimo strcpy aggiunge la "b" quindi la stringa restituita è "cbcb". Se non è rimasto nulla da copiare, orig dovrebbe puntare all'ASCIIZ della stringa di input.
jmucchiello

semplificazione: puoi sostituire quel primo forciclo con for (count = 1; ins = strstr(ins + rep_len, rep); ++count) {}, poi tmpviene utilizzato solo per la scrittura.
rampion

1
char * done = replace ("abcdefghijkl", "bc", "yz"); fare cose(); gratuito (fatto);
jmucchiello

2
Tieni presente che questa funzione restituisce NULL se non ci sono occorrenze da sostituire (if (! (Ins = strstr (orig, rep))) return NULL;). Non puoi semplicemente usare l'output, devi controllare se l'output è NULL e in tal caso usa la stringa originale (non limitarti a copiare il puntatore alla stringa del risultato perché free (result) poi libera la stringa originale). L'utilizzo è più semplice se la stringa di input viene semplicemente copiata nella stringa di output se non c'è nulla da sostituire.
Adversus

18

Questo non è fornito nella libreria C standard perché, dato solo un carattere * non è possibile aumentare la memoria allocata alla stringa se la stringa di sostituzione è più lunga della stringa da sostituire.

Puoi farlo usando std :: string più facilmente, ma anche lì, nessuna singola funzione lo farà per te.


12
Questa domanda riguarda C, non C ++.
Geremia

1 / strlen (char *) + 1 non è necessariamente uguale alla dimensione di archiviazione. 2 / Ci sono molte N versioni di funzioni stringa che ricevono un parametro aggiuntivo per la dimensione del buffer, quindi non c'è motivo per cui non possa esserci snreplace (). 3 / potrebbe esserci una funzione di sostituzione sul posto e non sul posto. 4 / come pensi che funzioni sprintf? Ha un argomento char * e non ha bisogno di aumentare l'allocazione di memoria, quindi non c'è motivo per cui una sostituzione non possa funzionare anche ... (sebbene C abbia un design "stringa" sbagliato e la dimensione del buffer dovrebbe sempre essere con il puntatore => snprintf)
Steven Spark

12

Non ce n'è uno.

Dovresti eseguire il rollio usando qualcosa come strstr e strcat o strcpy.


7
Dove sono archiviate le raccolte di fan delle funzioni utilizzate spesso? Sicuramente c'è già una biblioteca per questo ...
Pacerier

1
strcat()è un cattivo suggerimento.
Iharob Al Asimi

11

È possibile creare la propria funzione di sostituzione utilizzando strstr per trovare le sottostringhe e strncpy da copiare in parti in un nuovo buffer.

A meno che quello che vuoi non replace_withsia della stessa lunghezza di quello che vuoi replace, allora probabilmente è meglio usare un nuovo buffer per copiare la nuova stringa.


9

Poiché le stringhe in C non possono crescere dinamicamente, la sostituzione sul posto generalmente non funziona. Pertanto è necessario allocare spazio per una nuova stringa che abbia abbastanza spazio per la sostituzione e quindi copiare le parti dall'originale più la sostituzione nella nuova stringa. Per copiare le parti useresti strncpy .


La dimensione del buffer potrebbe essere maggiore di strlen, la stringa di sostituzione potrebbe essere più piccola della stringa sostituita ... quindi non è necessario allocare memoria per eseguire la sostituzione. (Anche sui microcontrollori potresti non avere una memoria infinita e potresti dover eseguire la sostituzione sul posto. Copiare tutto in un nuovo buffer potrebbe non essere la soluzione giusta per tutti ...)
Steven Spark

8

Ecco un codice di esempio che lo fa.

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

char * replace(
    char const * const original, 
    char const * const pattern, 
    char const * const replacement
) {
  size_t const replen = strlen(replacement);
  size_t const patlen = strlen(pattern);
  size_t const orilen = strlen(original);

  size_t patcnt = 0;
  const char * oriptr;
  const char * patloc;

  // find how many times the pattern occurs in the original string
  for (oriptr = original; patloc = strstr(oriptr, pattern); oriptr = patloc + patlen)
  {
    patcnt++;
  }

  {
    // allocate memory for the new string
    size_t const retlen = orilen + patcnt * (replen - patlen);
    char * const returned = (char *) malloc( sizeof(char) * (retlen + 1) );

    if (returned != NULL)
    {
      // copy the original string, 
      // replacing all the instances of the pattern
      char * retptr = returned;
      for (oriptr = original; patloc = strstr(oriptr, pattern); oriptr = patloc + patlen)
      {
        size_t const skplen = patloc - oriptr;
        // copy the section until the occurence of the pattern
        strncpy(retptr, oriptr, skplen);
        retptr += skplen;
        // copy the replacement 
        strncpy(retptr, replacement, replen);
        retptr += replen;
      }
      // copy the rest of the string.
      strcpy(retptr, oriptr);
    }
    return returned;
  }
}

#include <stdio.h>
int main(int argc, char * argv[])
{
  if (argc != 4)
  {
    fprintf(stderr,"usage: %s <original text> <pattern> <replacement>\n", argv[0]);
    exit(-1);
  }
  else
  {
    char * const newstr = replace(argv[1], argv[2], argv[3]);
    if (newstr)
    {
      printf("%s\n", newstr);
      free(newstr);
    }
    else
    {
      fprintf(stderr,"allocation error\n");
      exit(-2);
    }
  }
  return 0;
}

Funziona, ma è un po 'buggato, ma grazie comunque! : D eccone uno che ho trovato che funziona molto bene, coding.debuntu.org/… cheers! :)
Joe DF

4
// Here is the code for unicode strings!


int mystrstr(wchar_t *txt1,wchar_t *txt2)
{
    wchar_t *posstr=wcsstr(txt1,txt2);
    if(posstr!=NULL)
    {
        return (posstr-txt1);
    }else
    {
        return -1;
    }
}

// assume: supplied buff is enough to hold generated text
void StringReplace(wchar_t *buff,wchar_t *txt1,wchar_t *txt2)
{
    wchar_t *tmp;
    wchar_t *nextStr;
    int pos;

    tmp=wcsdup(buff);

    pos=mystrstr(tmp,txt1);
    if(pos!=-1)
    {
        buff[0]=0;
        wcsncpy(buff,tmp,pos);
        buff[pos]=0;

        wcscat(buff,txt2);

        nextStr=tmp+pos+wcslen(txt1);

        while(wcslen(nextStr)!=0)
        {
            pos=mystrstr(nextStr,txt1);

            if(pos==-1)
            {
                wcscat(buff,nextStr);
                break;
            }

            wcsncat(buff,nextStr,pos);
            wcscat(buff,txt2);

            nextStr=nextStr+pos+wcslen(txt1);   
        }
    }

    free(tmp);
}

3

La funzione repl_str () su creativeandcritical.net è veloce e affidabile. In quella pagina è inclusa anche una variante di stringa ampia, repl_wcs () , che può essere utilizzata con le stringhe Unicode comprese quelle codificate in UTF-8, tramite funzioni di supporto: il codice demo è collegato dalla pagina. Tardiva divulgazione completa: sono l'autore di quella pagina e delle funzioni in essa contenute.


3
veloce e affidabile, ma ha un'enorme perdita di memoria.
MightyPork

3
Non vedo come potrebbe. C'è solo un malloc e al chiamante viene chiesto di liberare la memoria quando non è più necessaria. Potresti essere più specifico?
Laird

@Lairdpos_cache = realloc(pos_cache
PSkocik

@PSkocik La funzione è stata aggiornata dopo il reclamo di @MightyPork ma anche se ora ha quel malloc / realloc aggiuntivo per pos_cache, non riesco a vedere un percorso di codice che eviti la free(pos_cache);fine della funzione at.
Laird

@Laird reallocpotrebbe fallire. Se lo fa, ritorna NULLe lascia intatto il vecchio puntatore. p = realloc(p, x)in caso di errore, riscriverà un puntatore di heap valido pcon NULL, e se quello pera il tuo unico riferimento a quell'oggetto di heap, ora lo hai perso. È un classico errore da principiante.
PSkocik

3

trovo che la maggior parte delle funzioni proposte sia difficile da capire, quindi ho pensato a questo:

static char *dull_replace(const char *in, const char *pattern, const char *by)
{
    size_t outsize = strlen(in) + 1;
    // TODO maybe avoid reallocing by counting the non-overlapping occurences of pattern
    char *res = malloc(outsize);
    // use this to iterate over the output
    size_t resoffset = 0;

    char *needle;
    while (needle = strstr(in, pattern)) {
        // copy everything up to the pattern
        memcpy(res + resoffset, in, needle - in);
        resoffset += needle - in;

        // skip the pattern in the input-string
        in = needle + strlen(pattern);

        // adjust space for replacement
        outsize = outsize - strlen(pattern) + strlen(by);
        res = realloc(res, outsize);

        // copy the pattern
        memcpy(res + resoffset, by, strlen(by));
        resoffset += strlen(by);
    }

    // copy the remaining input
    strcpy(res + resoffset, in);

    return res;
}

l'output deve essere liberato


2

Puoi usare questa funzione (i commenti spiegano come funziona):

void strreplace(char *string, const char *find, const char *replaceWith){
    if(strstr(string, replaceWith) != NULL){
        char *temporaryString = malloc(strlen(strstr(string, find) + strlen(find)) + 1);
        strcpy(temporaryString, strstr(string, find) + strlen(find));    //Create a string with what's after the replaced part
        *strstr(string, find) = '\0';    //Take away the part to replace and the part after it in the initial string
        strcat(string, replaceWith);    //Concat the first part of the string with the part to replace with
        strcat(string, temporaryString);    //Concat the first part of the string with the part after the replaced part
        free(temporaryString);    //Free the memory to avoid memory leaks
    }
}

1

Ecco quello che ho creato in base a questi requisiti:

  1. Sostituisci il modello indipendentemente dal fatto che sia lungo o più corto.

  2. Non utilizzare alcun malloc (esplicito o implicito) per evitare intrinsecamente perdite di memoria.

  3. Sostituisci un numero qualsiasi di occorrenze di pattern.

  4. Tollera la stringa di sostituzione che ha una sottostringa uguale alla stringa di ricerca.

  5. Non è necessario verificare che il Line array sia di dimensioni sufficienti per contenere la sostituzione. Ad esempio, non funziona a meno che il chiamante non sappia che la linea è di dimensioni sufficienti per contenere la nuova stringa.

/* returns number of strings replaced.
*/
int replacestr(char *line, const char *search, const char *replace)
{
   int count;
   char *sp; // start of pattern

   //printf("replacestr(%s, %s, %s)\n", line, search, replace);
   if ((sp = strstr(line, search)) == NULL) {
      return(0);
   }
   count = 1;
   int sLen = strlen(search);
   int rLen = strlen(replace);
   if (sLen > rLen) {
      // move from right to left
      char *src = sp + sLen;
      char *dst = sp + rLen;
      while((*dst = *src) != '\0') { dst++; src++; }
   } else if (sLen < rLen) {
      // move from left to right
      int tLen = strlen(sp) - sLen;
      char *stop = sp + rLen;
      char *src = sp + sLen + tLen;
      char *dst = sp + rLen + tLen;
      while(dst >= stop) { *dst = *src; dst--; src--; }
   }
   memcpy(sp, replace, rLen);

   count += replacestr(sp + rLen, search, replace);

   return(count);
}

Qualsiasi suggerimento per migliorare questo codice è accettato con gioia. Pubblica il commento e lo proverò.


1

Puoi usare strrep ()

char * strrep (const char * cadena, const char * strf, const char * strr)

strrep (Sostituisci stringa). Sostituisce "strf" con "strr" in "cadena" e restituisce la nuova stringa. È necessario liberare la stringa restituita nel codice dopo aver utilizzato strrep.

Parametri cadena La stringa con il testo. strf Il testo da trovare. strr Il testo sostitutivo.

Restituisce Il testo aggiornato con la sostituzione.

Il progetto può essere trovato su https://github.com/ipserc/strrep


0

una correzione alla risposta di fann95, utilizzando la modifica sul posto della stringa e assumendo che il buffer puntato dalla riga sia abbastanza grande da contenere la stringa risultante.

static void replacestr(char *line, const char *search, const char *replace)
{
     char *sp;

     if ((sp = strstr(line, search)) == NULL) {
         return;
     }
     int search_len = strlen(search);
     int replace_len = strlen(replace);
     int tail_len = strlen(sp+search_len);

     memmove(sp+replace_len,sp+search_len,tail_len+1);
     memcpy(sp, replace, replace_len);
}

0

Ecco fatto .... questa è la funzione per sostituire ogni occorrenza char xcon char yall'interno di una stringa di caratteristr

char *zStrrep(char *str, char x, char y){
    char *tmp=str;
    while(*tmp)
        if(*tmp == x)
            *tmp++ = y; /* assign first, then incement */
        else
            *tmp++;

    *tmp='\0';
    return str;
}

Un esempio di utilizzo potrebbe essere

  Exmaple Usage
        char s[]="this is a trial string to test the function.";
        char x=' ', y='_';
        printf("%s\n",zStrrep(s,x,y));

  Example Output
        this_is_a_trial_string_to_test_the_function.

La funzione proviene da una libreria di stringhe che mantengo su Github , sei più che benvenuto per dare un'occhiata ad altre funzioni disponibili o anche contribuire al codice :)

https://github.com/fnoyanisi/zString

EDIT: @siride ha ragione, la funzione sopra sostituisce solo i caratteri. Ho appena scritto questo, che sostituisce le stringhe di caratteri.

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

/* replace every occurance of string x with string y */
char *zstring_replace_str(char *str, const char *x, const char *y){
    char *tmp_str = str, *tmp_x = x, *dummy_ptr = tmp_x, *tmp_y = y;
    int len_str=0, len_y=0, len_x=0;

    /* string length */
    for(; *tmp_y; ++len_y, ++tmp_y)
        ;

    for(; *tmp_str; ++len_str, ++tmp_str)
        ;

    for(; *tmp_x; ++len_x, ++tmp_x)
        ;

    /* Bounds check */
    if (len_y >= len_str)
        return str;

    /* reset tmp pointers */
    tmp_y = y;
    tmp_x = x;

    for (tmp_str = str ; *tmp_str; ++tmp_str)
        if(*tmp_str == *tmp_x) {
            /* save tmp_str */
            for (dummy_ptr=tmp_str; *dummy_ptr == *tmp_x; ++tmp_x, ++dummy_ptr)
                if (*(tmp_x+1) == '\0' && ((dummy_ptr-str+len_y) < len_str)){
                /* Reached end of x, we got something to replace then!
                * Copy y only if there is enough room for it
                */
                    for(tmp_y=y; *tmp_y; ++tmp_y, ++tmp_str)
                        *tmp_str = *tmp_y;
            }
        /* reset tmp_x */
        tmp_x = x;
        }

    return str;
}

int main()
{
    char s[]="Free software is a matter of liberty, not price.\n"
             "To understand the concept, you should think of 'free' \n"
             "as in 'free speech', not as in 'free beer'";

    printf("%s\n\n",s);
    printf("%s\n",zstring_replace_str(s,"ree","XYZ"));
    return 0;
}

E di seguito è riportato l'output

Free software is a matter of liberty, not price.
To understand the concept, you should think of 'free' 
as in 'free speech', not as in 'free beer'

FXYZ software is a matter of liberty, not price.
To understand the concept, you should think of 'fXYZ' 
as in 'fXYZ speech', not as in 'fXYZ beer'

Sostituisce solo i singoli caratteri, non le sottostringhe.
siride

0
/*замена символа в строке*/
char* replace_char(char* str, char in, char out) {
    char * p = str;

    while(p != '\0') {
        if(*p == in)
            *p == out;
        ++p;
    }

    return str;
}

segfault quando str è nullo
Code_So1dier

0
DWORD ReplaceString(__inout PCHAR source, __in DWORD dwSourceLen, __in const char* pszTextToReplace, __in const char* pszReplaceWith)
{
    DWORD dwRC = NO_ERROR;
    PCHAR foundSeq = NULL;
    PCHAR restOfString = NULL;
    PCHAR searchStart = source;
    size_t szReplStrcLen = strlen(pszReplaceWith), szRestOfStringLen = 0, sztextToReplaceLen = strlen(pszTextToReplace), remainingSpace = 0, dwSpaceRequired = 0;
    if (strcmp(pszTextToReplace, "") == 0)
        dwRC = ERROR_INVALID_PARAMETER;
    else if (strcmp(pszTextToReplace, pszReplaceWith) != 0)
    {
        do
        {
            foundSeq = strstr(searchStart, pszTextToReplace);
            if (foundSeq)
            {
                szRestOfStringLen = (strlen(foundSeq) - sztextToReplaceLen) + 1;
                remainingSpace = dwSourceLen - (foundSeq - source);
                dwSpaceRequired = szReplStrcLen + (szRestOfStringLen);
                if (dwSpaceRequired > remainingSpace)
                {
                    dwRC = ERROR_MORE_DATA;
                }

                else
                {
                    restOfString = CMNUTIL_calloc(szRestOfStringLen, sizeof(CHAR));
                    strcpy_s(restOfString, szRestOfStringLen, foundSeq + sztextToReplaceLen);

                    strcpy_s(foundSeq, remainingSpace, pszReplaceWith);
                    strcat_s(foundSeq, remainingSpace, restOfString);
                }

                CMNUTIL_free(restOfString);
                searchStart = foundSeq + szReplStrcLen; //search in the remaining str. (avoid loops when replWith contains textToRepl 
            }
        } while (foundSeq && dwRC == NO_ERROR);
    }
    return dwRC;
}

0
char *replace(const char*instring, const char *old_part, const char *new_part)
{

#ifndef EXPECTED_REPLACEMENTS
    #define EXPECTED_REPLACEMENTS 100
#endif

    if(!instring || !old_part || !new_part)
    {
        return (char*)NULL;
    }

    size_t instring_len=strlen(instring);
    size_t new_len=strlen(new_part);
    size_t old_len=strlen(old_part);
    if(instring_len<old_len || old_len==0)
    {
        return (char*)NULL;
    }

    const char *in=instring;
    const char *found=NULL;
    size_t count=0;
    size_t out=0;
    size_t ax=0;
    char *outstring=NULL;

    if(new_len> old_len )
    {
        size_t Diff=EXPECTED_REPLACEMENTS*(new_len-old_len);
        size_t outstring_len=instring_len + Diff;
        outstring =(char*) malloc(outstring_len); 
        if(!outstring){
            return (char*)NULL;
        }
        while((found = strstr(in, old_part))!=NULL)
        {
            if(count==EXPECTED_REPLACEMENTS)
            {
                outstring_len+=Diff;
                if((outstring=realloc(outstring,outstring_len))==NULL)
                {
                     return (char*)NULL;
                }
                count=0;
            }
            ax=found-in;
            strncpy(outstring+out,in,ax);
            out+=ax;
            strncpy(outstring+out,new_part,new_len);
            out+=new_len;
            in=found+old_len;
            count++;
        }
    }
    else
    {
        outstring =(char*) malloc(instring_len);
        if(!outstring){
            return (char*)NULL;
        }
        while((found = strstr(in, old_part))!=NULL)
        {
            ax=found-in;
            strncpy(outstring+out,in,ax);
            out+=ax;
            strncpy(outstring+out,new_part,new_len);
            out+=new_len;
            in=found+old_len;
        }
    }
    ax=(instring+instring_len)-in;
    strncpy(outstring+out,in,ax);
    out+=ax;
    outstring[out]='\0';

    return outstring;
}

0

Questa funzione funziona solo se la tua stringa ha spazio extra per una nuova lunghezza

void replace_str(char *str,char *org,char *rep)
{
    char *ToRep = strstr(str,org);
    char *Rest = (char*)malloc(strlen(ToRep));
    strcpy(Rest,((ToRep)+strlen(org)));

    strcpy(ToRep,rep);
    strcat(ToRep,Rest);

    free(Rest);
}

Sostituisce solo la prima occorrenza


0

Ecco il mio, è autonomo e versatile, oltre che efficiente, cresce o restringe i buffer secondo necessità in ogni ricorsione

void strreplace(char *src, char *str, char *rep)
{
    char *p = strstr(src, str);
    if (p)
    {
        int len = strlen(src)+strlen(rep)-strlen(str);
        char r[len];
        memset(r, 0, len);
        if ( p >= src ){
            strncpy(r, src, p-src);
            r[p-src]='\0';
            strncat(r, rep, strlen(rep));
            strncat(r, p+strlen(str), p+strlen(str)-src+strlen(src));
            strcpy(src, r);
            strreplace(p+strlen(rep), str, rep);
        }
    }
}

0

Ecco il mio, rendili tutti char *, il che rende più facile la chiamata ...

char *strrpc(char *str,char *oldstr,char *newstr){
    char bstr[strlen(str)];
    memset(bstr,0,sizeof(bstr));
    int i;
    for(i = 0;i < strlen(str);i++){
        if(!strncmp(str+i,oldstr,strlen(oldstr))){
            strcat(bstr,newstr);
            i += strlen(oldstr) - 1;
        }else{
                strncat(bstr,str + i,1);
            }
    }

    strcpy(str,bstr);
    return str;
}

0

Utilizzando solo strlen da string.h

mi scusi per il mio inglese

char * str_replace(char * text,char * rep, char * repw){//text -> to replace in it | rep -> replace | repw -> replace with
    int replen = strlen(rep),repwlen = strlen(repw),count;//some constant variables
    for(int i=0;i<strlen(text);i++){//search for the first character from rep in text
        if(text[i] == rep[0]){//if it found it
            count = 1;//start searching from the next character to avoid repetition
            for(int j=1;j<replen;j++){
                if(text[i+j] == rep[j]){//see if the next character in text is the same as the next in the rep if not break
                    count++;
                }else{
                    break;
                }
            }
            if(count == replen){//if count equals to the lenght of the rep then we found the word that we want to replace in the text
                if(replen < repwlen){
                    for(int l = strlen(text);l>i;l--){//cuz repwlen greater than replen we need to shift characters to the right to make space for the replacement to fit
                        text[l+repwlen-replen] = text[l];//shift by repwlen-replen
                    }
                }
                if(replen > repwlen){
                    for(int l=i+replen-repwlen;l<strlen(text);l++){//cuz replen greater than repwlen we need to shift the characters to the left
                        text[l-(replen-repwlen)] = text[l];//shift by replen-repwlen
                    }
                    text[strlen(text)-(replen-repwlen)] = '\0';//get rid of the last unwanted characters
                }
                for(int l=0;l<repwlen;l++){//replace rep with repwlen
                    text[i+l] = repw[l];
                }
                if(replen != repwlen){
                    i+=repwlen-1;//pass to the next character | try text "y" ,rep "y",repw "yy" without this line to understand
                }
            }
        }
    }
    return text;
}

se vuoi che il codice strlen eviti di chiamare string.h

int strlen(char * string){//use this code to avoid calling string.h
    int lenght = 0;
    while(string[lenght] != '\0'){
        lenght++;
    }
    return lenght;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.