Reemplazar elemento de carácter individual de una cadena C [duplicate]

3 minutos de lectura

avatar de usuario de user1163974
usuario1163974

Estoy tratando de hacer algo realmente básico en C, pero sigo teniendo una falla de segmentación. Todo lo que quiero hacer es reemplazar una letra de una palabra con una letra diferente; en este ejemplo, reemplace la l con una L. ¿Alguien puede ayudarme a explicar dónde me equivoqué? Creo que debería ser un problema realmente básico, simplemente no tengo idea de por qué no funciona.

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

int main(int argc, char *argv[])
{
    char *string1;

    string1 = "hello";
    printf("string1 %s\n", string1);    

    printf("string1[2] %c\n", string1[2]);
    string1[2] = 'L';
    printf("string1 %s\n", string1);

    return 0;
}

Para mi salida obtengo

cadena1 hola
cadena1[2] yo
Fallo de segmentación

¡Gracias!

  • String1 es un puntero a la memoria de solo lectura (en la mayoría de los sistemas) ya que es un inicializador constante. No puede escribir en esa cadena sin copiarla primero.

    – calibre

    16 de abril de 2013 a las 1:45


string1 = "hello";
string1[2] = 'L';

no puede cambiar los literales de cadena, es un comportamiento indefinido. Prueba esto:

char string1[] = "hello";

O tal vez:

char *string1;
string1 = malloc(6); /* hello + 0-terminator */
strcpy(string1, "hello");

/* Stuff. */

free(string1);

  • ¡Ok, gracias! Le daré una oportunidad.

    – usuario1163974

    5 de febrero de 2012 a las 12:51

  • Nada grande, pero puede usar strdup(“hello”) en lugar de una llamada a malloc y strcpy. strdup hace esto por ti, es más conveniente de usar

    – Zoneur

    5 de febrero de 2012 a las 13:32

  • @Zoneur Sí, a menudo recomiendo strdup pero a veces es problemático porque no es estándar.

    – cnicutar

    5 de febrero de 2012 a las 13:33

  • @cnicutar no sabia de esto, gracias 🙂

    – Zoneur

    5 de febrero de 2012 a las 13:41

  • Si quiero cambiar este valor? “hola” a “helxo” su código no funciona… para cambiar un valor específico (en un puntero)… Reemplace el elemento de carácter individual de una cadena C

    usuario3402040

    10 de mayo de 2017 a las 11:48


char *string1;
string1 = "hello";

string1 apunta a un literal de cadena y los literales de cadena no se pueden modificar.

Lo que puede hacer es inicializar una matriz con los elementos de un literal de cadena.

char string1[] =  "hello";

los elementos de string1 matriz son modificables.

char *string1 = "hello";

Al ejecutar el código, el literal de cadena estará en una sección que es de solo lectura. El sistema operativo no permite que el código cambie ese bloque de memoria, por lo que obtiene una falla de segmento.

char string1[] = "hello";

El literal de cadena se insertará en la pila cuando ejecute el código.

 string1[2] = 'L';

está tratando de cambiar un literal de cadena que tiene un comportamiento indefinido en C. En su lugar, use string1[]="hello";
La falla de segmentación que obtiene es porque el literal probablemente esté almacenado en la sección de solo lectura de la memoria y tratar de escribir en él produce un comportamiento indefinido.

¿Ha sido útil esta solución?