std:: strtok
|
Definido en el encabezado
<cstring>
|
||
|
char
*
strtok
(
char
*
str,
const
char
*
delim
)
;
|
||
Tokeniza una cadena de bytes terminada en nulo.
Una secuencia de llamadas a
std::strtok
divide la cadena apuntada por
str
en una secuencia de tokens, cada uno delimitado por un carácter de la cadena apuntada por
delim
. Cada llamada en la secuencia tiene un
objetivo de búsqueda
:
- Si str no es nulo, la llamada es la primera llamada en la secuencia. El objetivo de búsqueda es la cadena de bytes terminada en nulo apuntada por str .
- Si str es nulo, la llamada es una de las llamadas subsiguientes en la secuencia. El objetivo de búsqueda está determinado por la llamada previa en la secuencia.
Cada llamada en la secuencia busca en el objetivo de búsqueda el primer carácter que no está contenido en la cadena separadora apuntada por delim , la cadena separadora puede ser diferente en cada llamada.
- Si no se encuentra dicho carácter, entonces no hay tokens en el objetivo de búsqueda. El objetivo de búsqueda para la siguiente llamada en la secuencia permanece sin cambios. [1]
-
Si se encuentra dicho carácter, es el inicio del token actual.
std::strtokluego busca desde allí el primer carácter que está contenido en la cadena de separadores.- Si no se encuentra dicho carácter, el token actual se extiende hasta el final del objetivo de búsqueda. El objetivo de búsqueda para la siguiente llamada en la secuencia es una cadena vacía. [2]
- Si se encuentra dicho carácter, se sobrescribe con un carácter nulo, que termina el token actual. El objetivo de búsqueda para la siguiente llamada en la secuencia comienza desde el carácter siguiente.
Si str o delim no es un puntero a una cadena de bytes terminada en nulo, el comportamiento es indefinido.
- ↑ Aún puede formarse un token en una llamada posterior con una cadena separadora diferente.
- ↑ No se pueden formar más tokens en llamadas posteriores.
Contenidos |
Parámetros
| str | - | puntero a la cadena de bytes terminada en nulo a tokenizar |
| delim | - | puntero a la cadena de bytes terminada en nulo que identifica delimitadores |
Valor de retorno
Devuelve un puntero al primer carácter del siguiente token, o un puntero nulo si no hay ningún token.
Notas
Esta función es destructiva: escribe los
'
\0
'
caracteres en los elementos de la cadena
str
. En particular, un
string literal
no puede usarse como primer argumento de
std::strtok
.
Cada llamada a esta función modifica una variable estática: no es seguro para hilos.
A diferencia de la mayoría de otros tokenizadores, los delimitadores en
std::strtok
pueden ser diferentes para cada token subsiguiente, e incluso pueden depender del contenido de los tokens anteriores.
Implementación posible
char* strtok(char* str, const char* delim) { static char* buffer; if (str != nullptr) buffer = str; buffer += std::strspn(buffer, delim); if (*buffer == '\0') return nullptr; char* const tokenBegin = buffer; buffer += std::strcspn(buffer, delim); if (*buffer != '\0') *buffer++ = '\0'; return tokenBegin; } |
Las implementaciones reales de bibliotecas C++ de esta función delegan en la biblioteca C, donde puede implementarse directamente (como en MUSL libc ), o en términos de su versión reentrante (como en GNU libc ).
Ejemplo
#include <cstring> #include <iomanip> #include <iostream> int main() { char input[] = "one + two * (three - four)!"; const char* delimiters = "! +- (*)"; char* token = std::strtok(input, delimiters); while (token) { std::cout << std::quoted(token) << ' '; token = std::strtok(nullptr, delimiters); } std::cout << "\nContents of the input string now:\n\""; for (std::size_t n = 0; n < sizeof input; ++n) { if (const char c = input[n]; c != '\0') std::cout << c; else std::cout << "\\0"; } std::cout << "\"\n"; }
Salida:
"one" "two" "three" "four" Contents of the input string now: "one\0+ two\0* (three\0- four\0!\0"
Véase también
|
encuentra la primera ubicación de cualquier carácter de un conjunto de separadores
(función) |
|
|
devuelve la longitud del segmento inicial máximo que consiste
únicamente en caracteres no encontrados en otra cadena de bytes (función) |
|
|
devuelve la longitud del segmento inicial máximo que consiste
únicamente en caracteres encontrados en otra cadena de bytes (función) |
|
|
(C++20)
|
una
view
sobre los subrangos obtenidos al dividir otra
view
usando un delimitador
(plantilla de clase) (objeto adaptador de rango) |
|
Documentación de C
para
strtok
|
|