Fallo de segmento de Strtok [duplicate]

1 minuto de lectura

Fallo de segmento de Strtok duplicate
artiomboyko

Posible duplicado:

strtok dando falla de segmentación

¿Por qué obtengo una falla de segmento usando este código?

void test(char *data)
{
    char *pch;
    pch = strtok(data, " ,.-"); // segfault
    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, " ,.-");
    }

    return NULL;
}

char *data = "- This, a sample string.";
test(data);

  • Esto se ha preguntado muchas veces antes.

    – Adam Rosenfield

    17 de agosto de 2011 a las 22:29

1647691386 154 Fallo de segmento de Strtok duplicate
gancho

strtok() modifica la cadena original. le estas pasando un constante cadena de origen que no se puede modificar.

Prueba esto en su lugar:

char *data = strdup("- This, a sample string.");
test(data);

  • O simplemente char data[] = "- This, a sample string.";

    – café

    17 de agosto de 2011 a las 22:22

  • El código modificado demostrará una versión que no fallará porque el literal de la cadena de tiempo de compilación se copia en un nuevo búfer asignado al montón que permite que strtok funcione.

    – hookenz

    17 de agosto de 2011 a las 22:22

  • Sin embargo, eso creará una pérdida de memoria, a menos que recuerde liberar datos una vez que haya terminado.

    – Mikola

    17 de agosto de 2011 a las 22:24

  • … y la alternativa que sugiero tampoco fallará, porque el literal de cadena en tiempo de compilación se copia en un nuevo búfer asignado a la pila.

    – café

    17 de agosto de 2011 a las 22:26

  • También tenga en cuenta que strdup no es parte de ANSI C, sino POSIX.

    -Evan Mulawski

    17 de agosto de 2011 a las 22:29

strtok modifica la cadena. Está pasando un puntero a datos de solo lectura (una constante de cadena).

Intente usar una matriz de caracteres.

char data[] ="- This, is a sample string."
test(data);

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad