Ok, entiendo que strtok modifica su argumento de entrada, pero en este caso, colapsa la cadena de entrada en solo el primer token. ¿Por qué sucede esto y qué puedo hacer para solucionarlo? (Tenga en cuenta que no estoy hablando de la variable “temp”, que deberían ser el primer token, sino la variable “entrada”, que después de una llamada a strtok se convierte en “esto”)
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
char input[]="this is a test of the tokenizor seven";
char * temp;
temp=strtok(input," ");
printf("input: %s\n", input); //input is now just "this"
}
Cuándo strtok()
encuentra una ficha, cambia el carácter inmediatamente después de la ficha en un \0
y luego devuelve un puntero al token. La próxima vez que lo llame con un NULL
argumento, comienza a buscar los separadores que terminaron el primer token, es decir, después del \0
y posiblemente más adelante.
Ahora, el puntero original al comienzo de la cadena aún apunta al comienzo de la cadena, pero el primer token ahora es \0
-terminado — es decir, printf()
piensa que el final del token es el final de la cadena. El resto de los datos sigue ahí, pero eso \0
se detiene printf()
de mostrarlo. Si usaste un for
-loop para recorrer la cadena de entrada original hasta el número original de caracteres, encontraría que todos los datos todavía están allí.
Debe imprimir el token que recibe de strtok
y no se preocupe por la matriz de entrada porque los NULL serán insertados por strtok
. Necesita llamadas repetidas para obtener todos los tokens:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
char input[]="this is a test of the tokenizor seven";
char * temp;
temp=strtok(input," ");
while( temp != NULL ) {
printf("temp is \"%s\"\n", temp );
temp = strtok( NULL, " ");
}
}
Es porque strtok inserta valores nulos en cada separador, razón por la cual usa llamadas repetidas a strtok para obtener cada token. La cadena de entrada no se puede usar una vez que comience a usar strtok. No lo “arreglas”, así es como funciona.