una separar letras funciona como cadena c++ c string pointers strtok

c++ - separar - strtok arduino



strtok()-¿Por qué tienes que pasar el puntero NULL para obtener el siguiente token en la cadena? (2)

Si pasa un valor que no sea NULL, le está pidiendo que comience a tokenizar una cadena diferente.

Si pasa un valor NULL, está pidiendo que continúe tokenizando lo mismo que antes.

Esta es la explicación de strtok ().

#include <string.h> char* strtok( char* s1, const char* s2 );*

La primera llamada a strtok () devuelve un puntero al primer token en la cadena señalada por s1. Las llamadas subsiguientes a strtok () deben pasar un puntero NULO como primer argumento, para obtener el siguiente token en la cadena.

Pero no sé por qué tienes que pasar el puntero NULL para obtener el siguiente token en la cadena. Busqué unos 15 minutos, pero no encontré una explicación en internet.


strtok() mantiene algunos datos dentro de sí mismo mediante el uso de variables estáticas. De esta manera, strtok() puede continuar buscando desde el punto en que se detuvo durante la llamada anterior. Para indicar a strtok() que desea seguir buscando la misma cadena, pasa un puntero NULL como su primer argumento. strtok() verifica si el primer argumento es NULL y, si lo es, usa sus datos almacenados actualmente. Si el primer parámetro no es nulo, se trata como una nueva búsqueda y se restablecen todos los datos internos.

Quizás lo mejor que puedes hacer es buscar una implementación real de la strtok() . He encontrado uno lo suficientemente pequeño como para publicarlo aquí, para que tengas una idea de cómo manejar este parámetro NULL:

/* Copyright (c) Microsoft Corporation. All rights reserved. */ #include <string.h> /* ISO/IEC 9899 7.11.5.8 strtok. DEPRECATED. * Split string into tokens, and return one at a time while retaining state * internally. * * WARNING: Only one set of state is held and this means that the * WARNING: function is not thread-safe nor safe for multiple uses within * WARNING: one thread. * * NOTE: No library may call this function. */ char * __cdecl strtok(char *s1, const char *delimit) { static char *lastToken = NULL; /* UNSAFE SHARED STATE! */ char *tmp; /* Skip leading delimiters if new string. */ if ( s1 == NULL ) { s1 = lastToken; if (s1 == NULL) /* End of story? */ return NULL; } else { s1 += strspn(s1, delimit); } /* Find end of segment */ tmp = strpbrk(s1, delimit); if (tmp) { /* Found another delimiter, split string and save state. */ *tmp = ''/0''; lastToken = tmp + 1; } else { /* Last segment, remember that. */ lastToken = NULL; } return s1; }