Fallo de segmentación con strtok

#include #include int main(){ char path[] = "/fs/lost+found"; char* temp; temp = strtok(path,"lost+found"); while(temp != NULL){ printf("\n %s \n",temp); temp = strtok(path,"lost+found"); } return 0; } 

Quería extraer la cadena perdida + encontrada. El progtwig anterior entra en un bucle infinito e imprime el “/” que está antes del delimitador “perdido + encontrado”

[root @ rs] # ./a.out Fallo de segmentación

Cometiste dos errores (como puedes descubrir fácilmente desde aquí ).

  1. strtok() toma como segundo argumento un delimitador . En su caso, este delimitador no se lost+found sino razonablemente / .

  2. dentro del bloque while , el primer parámetro de la función strtok debe ser NULL para que la función continúe explorando donde finalizó una llamada exitosa anterior a la función.

Finalmente, debe usar strcmp() para descubrir si el token procesado es la cadena que está buscando.

Asi que:

  ... while (temp != NULL) { if (strcmp("lost+found", temp) == 0) printf ("%s\n", temp); // found temp = strtok (NULL, "/"); } ... // not found 

del hombre 3 strtok:

char * strtok (char * str, const char * delim);

La función strtok () analiza una cadena en una secuencia de tokens. En la primera llamada a strtok (), la cadena a analizar debe especificarse en str. En cada llamada subsiguiente que deba analizar la misma cadena, str debe ser NULL.

Fijar:

 #include #include int main(){ char path[] = "/fs/lost+found"; char* temp; temp = strtok(path,"/"); // ^^^ different delimiter do { printf("%s\n", temp); temp = strtok(NULL, "/"); // ^^^^ each subsequent call to strtok with NULL as 1st argument } while (temp != NULL); return 0; } 

Imprimirá los tokens “fs” y “lost + found”. Puede agregar algunas comprobaciones si temp tiene actualmente el valor que está buscando y luego puede almacenar en otra variable.

El argumento delim especifica un conjunto de caracteres que delimitan los tokens en la cadena analizada.

El segundo argumento que ha proporcionado para strtok proporciona un conjunto de delimitadores para tokenizar la cadena dada, no para extraer una cadena particular

Utilizar strstr

 temp = strstr(path,"lost+found"); 

Esto devuelve un puntero a la subcadena que está buscando

No puede cambiar una cadena literal, y strtok() modificará la cadena en la que está trabajando.