reemplazando todas las apariciones de% con %%?, ¿necesita una función?

¿Existe un método práctico para reemplazar todas las apariciones de % con %% en la siguiente cadena?

 char * str = "%s %s %s"; printf("%s",str); 

entonces el resultado es:

  %%s %%s %%s 

¿o debo usar una función que escanea cada carácter en la cadena hasta que encuentre % , y luego la reemplace con %% ?

Debe comprender que la sustitución no se puede realizar en la misma str , ya que un mayor número de caracteres requerirá más memoria. Así que antes de reemplazar el número de reemplazo debe ser contado.

La siguiente función permite convertir cualquier reemplazo de un solo carácter a cadena (conjunto de caracteres).

 char *replace(const char *s, char ch, const char *repl) { // counting the number of future replacements int count = 0; const char *t; for(t=s; *t; t++) { count += (*t == ch); } // allocation the memory for resulting string size_t rlen = strlen(repl); char *res = malloc(strlen(s) + (rlen-1)*count + 1); if(!res) { return 0; } char *ptr = res; // making new string with replacements for(t=s; *t; t++) { if(*t == ch) { memcpy(ptr, repl, rlen); // past sub-string ptr += rlen; // and shift pointer } else { *ptr++ = *t; // just copy the next character } } *ptr = 0; // providing the result (memory allocated in this function // should be released outside this function with free(void*) ) return res; } 

Para su tarea particular, esta función se puede utilizar como

 char * str = "%s %s %s"; char * newstr = replace(str, '%', "%%"); if( newstr ) printf("%s",newstr); else printf ("Problems with making string!\n"); 

Preste atención, esa nueva cadena se almacena en el montón (memoria dinámica asignada con respecto al tamaño de la cadena inicial y el número de reemplazos), por lo que la memoria se debe reasignar cuando newstr no se necesita newstr , y antes de que el progtwig salga del scope de newstr puntero.

Solo piensa en un lugar para

 if( newstr ) { free(newstr); newstr = 0; }