Estoy tratando de leer el archivo en c y almacenarlo en una matriz. Después de eso, necesito convertir a entero relacionado con la entrada. Pero tengo una falla de segmentación. Cuando busco una razón, me di cuenta de que strtok () causa una falla de segmentación. Intenté algunas soluciones pero no pude hacerlo.

Mi archivo de entrada es como:

1:2:3:4:5:6
6:5:4:3:2:1

Y lo guardo en una matriz.

Tenga en cuenta que: necesito dividirlo por el carácter ":". Y cada artículo debe ser digito.

Entonces mi código está abajo:

char* line = arr[i];
int d = atoi(strtok(line, ":"));
for ( j = 0; j < SIZE; j++) {
    pushLinkedList(&tmp->P, d);
    d= atoi(strtok(NULL, ":"));  /* This part causes segmentation fault.   */

}

¿Cómo puedo deshacerme de esta falla? Gracias por adelantado.

0
YMG 25 dic. 2019 a las 05:05

2 respuestas

La mejor respuesta

¿Cómo puede estar tan seguro de que es strtok() lo que está causando la falla de segmentación?

Compile y ejecute este programa y verifique el comportamiento:

#include <stdlib.h>

int main(void) {
    atoi (NULL);
    return 0;
}

De strtok [énfasis agregado] :

Valor de retorno

Devuelve el puntero al comienzo del siguiente token o NULL si no hay más tokens.

Mira estas declaraciones:

for ( j = 0; j < SIZE; j++) {
    pushLinkedList(&tmp->P, d);
    d= atoi(strtok(NULL, ":"));
    .....
    .....

Si SIZE tiene un valor mayor que <number of tokens> - 1, entonces strtok() devolverá NULL para la n th iteración donde n es igual a <number of tokens> en la cadena.

Como no ha mostrado el valor de SIZE en el código publicado, creo que es mayor que la cantidad de tokens en la cadena procesada en el bucle. Cuando strtok() encuentra todos los tokens en la cadena dada, todas las llamadas futuras a strtok() devolverán un puntero NULL y este puntero NULL se pasa a atoi() que está resultando en una falla de segmentación. Debe verificar el valor de retorno de strtok() y pasarlo a atoi solo cuando no sea un NULL.

Usted puede hacer:

int d;
char* line = arr[i];
char* tok = strtok(line, ":");
while (tok) {
    d = atoi(tok);
    pushLinkedList(&tmp->P, d);
    tok = strtok(NULL, ":");
}

Adicional:
¿Por qué no debe usar atoi()?

4
H.S. 25 dic. 2019 a las 06:31

strtok no está causando la segfault. atoi es, porque le estás pasando un puntero nulo. Debe verificar si strtok devuelve un puntero nulo y salir de su ciclo si lo hace, en lugar de simplemente entregarlo ciegamente a atoi.

3
Joseph Sible-Reinstate Monica 25 dic. 2019 a las 02:07