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.
2 respuestas
¿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()
?
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
.
Preguntas relacionadas
Nuevas preguntas
c
C es un lenguaje de programación de uso general utilizado para la programación del sistema (SO e integrado), bibliotecas, juegos y multiplataforma. Esta etiqueta debe usarse con preguntas generales sobre el lenguaje C, como se define en el estándar ISO 9899 (la última versión, 9899: 2018, a menos que se especifique lo contrario; también etiquete las solicitudes específicas de la versión con c89, c99, c11, etc.). C es distinto de C ++ y no debe combinarse con la etiqueta C ++ en ausencia de una razón racional.