cómo reemplazar un char en char *

novato total aquí. Estaba intentando reemplazar un carácter en char * pero mi progtwig da error

#include  int main(int argc, char **argv) { char *mystring ="love is alweys better yoe"; int count = 1; for (count ; count  0x41) && (mystring[count+1] < 0x7A))) { mystring[count] = 0x45; //here occur the freezing printf ("%c\n", mystring[count]); //break; }; }; printf("%s\n",mystring); return 0; } 

los

 char *mystring ="love is alweys better yoe" 

hace mystring solo lectura

necesita copiar la cadena en un búfer antes de poder cambiarlo

p.ej

 char mystring[128]; strcpy( mystring , "love is alweys better yoe" ); 

Asignación de stack

 char *mystring ="love is alweys better yoe"; 

Esto crea una cadena literal en la memoria de solo lectura, y posteriormente no puede escribir en ella para cambiar los caracteres.

Deberías inicializar tu cadena así:

 char mystring[] ="love is alweys better yoe"; 

Esto asignará una matriz de caracteres de tamaño 26 bytes – 1 byte por carácter, terminada con un carácter nulo \0 .

Tenga en cuenta que si intenta escribir más allá del final del búfer (es decir, más allá del carácter \0 ), puede estar invadiendo la memoria asignada para otros datos en su progtwig, y ​​esto puede tener consecuencias indeseables.

Asignación de montón

El ejemplo anterior asigna memoria en la stack y se liberará al final del nivel de scope actual (generalmente la función en la que se encuentra). Si desea que la memoria persista más allá del final de la llamada a la función, debe asignarla en el montón de la siguiente manera:

 int bufferSize = 26; char* mystring = malloc(bufferSize); strncpy(mystring, "love is alweys better yoe", bufferSize); 

Y deberás recordar free este recuerdo cuando hayas terminado con él:

 free(mystring); 

Si se está liberando de la función de llamada, deberá devolver el puntero char* a la persona que llama, para que sepa qué ubicación de la memoria debe free . Si no free esta memoria, tu progtwig perderá memoria.

Aumento del tamaño de la cuerda.

Si necesita redimensionar la cadena después de realloc memoria, puede usar realloc :

 char* mybiggerString = realloc(mystring, bufferSize + 10); strncpy(mystring, "I can fit more in this string now!", bufferSize); 

“en el char *” no tiene sentido. No puede cambiar las cosas que están “en” el puntero, porque no hay nada “en” el puntero, no contiene cosas. Apunta a las cosas. Por eso se llama un “puntero”, no un “contenedor”.

Cuando escribes char *mystring ="love is alweys better yoe"; , haces que mystring apunte a una cadena literal . Esta es una parte de la memoria que se dedica a mantener el texto. Se encuentra en un área especial de la memoria que no se puede cambiar . (El texto se almacena en el archivo .exe; en la mayoría de las implementaciones, el sistema operativo carga el archivo .exe en la memoria y luego apunta el puntero hacia esa parte del archivo .exe cargado. No puede cambiar esta memoria porque el sistema operativo lo prohíbe – Básicamente, para que sea más difícil crear un virus.)

Solución: Use un trozo de memoria modificable. Escríbelo de esta manera: char mystring[] = "love is alweys better yoe"; . La cadena literal seguirá existiendo en su progtwig, pero esto le indica al progtwig que cree un búfer (en la memoria que se puede cambiar) y copie el literal en el búfer. Este búfer tiene exactamente la misma longitud que el literal, por lo que aún no puede agregar a la cadena, solo cambie los caracteres existentes o córtelo (escribiendo un byte nulo en algún lugar en el medio).