funciones strtok. ¿Cómo funciona la función strtok en C? Ejemplo: código fuente del programa

Otros alias

strtok

REVISAR

#incluir

char *trazo(char *cadena, carácter constante *delim);
char *strtok_r(char *cadena, carácter constante *delim,carbonizarse**guardarptr);

Requisitos para la macro de prueba de propiedades para glibc (consulte característica_prueba_macros(7)):

strtok_r(): _SVID_SOURCE || _BSD_SOURCE || _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_FUENTE

DESCRIPCIÓN

Función strtok() divide una cadena en una secuencia de cero o más tokens no vacíos. En primera llamada strtok() la cadena a analizar debe especificarse en el argumento cadena. En cada llamada posterior que analiza la misma cadena, el valor cadena debe ser NULO.

En discusión delim Se especifica un conjunto de bytes que se consideran separadores de tokens en la cadena analizada. La persona que llama puede especificar diferentes líneas en delim en llamadas posteriores al analizar la misma cadena.

cada llamada strtok() devuelve un puntero a una cadena terminada en nulo que contiene el siguiente token. Esta línea no incluye un byte delimitador. Si no hay más fichas, entonces strtok() devuelve NULO.

Secuencia de llamadas strtok(), que operan en una sola cadena, mantienen un puntero que especifica el punto en el que comienza la búsqueda del siguiente token. Primera llamada strtok() asigna a este puntero una referencia al primer byte de la cadena. El inicio del siguiente token se determina buscando hacia adelante en cadena el siguiente byte no es un delimitador. Si se encuentra un byte, se toma como el comienzo del siguiente token. Si no se encuentra dicho byte, entonces no hay más tokens y strtok() devuelve NULL (para una cadena vacía o delimitada, en cuyo caso se devolverá NULL la primera vez que se llame strtok()).

El final de cada token se encuentra mediante una búsqueda directa hasta que se encuentra un byte delimitador o un byte nulo final ("\0"). Si se encuentra un byte delimitador, se reemplaza con un byte nulo para terminar el token actual, y strtok() almacena un puntero al siguiente byte; este puntero se utilizará como punto de partida al buscar el siguiente token. En este caso strtok() devuelve un puntero al comienzo del token encontrado.

De la descripción anterior se deduce que una secuencia de dos o más bytes delimitadores contiguos en la línea que se escanea se considera un delimitador único y los bytes delimitadores al principio o al final de la cadena se ignoran. En otras palabras, los tokens devueltos strtok() - siempre cadenas no vacías. Es decir, por ejemplo, si hay una línea " aaa;;bbb,", luego llamadas posteriores strtok() con separadores de línea dados " ;, "devolvería las cadenas" aaa" Y " bbb" y luego un puntero nulo.

Función strtok_r() es la versión reentrante strtok(). Argumento guardarptr es un puntero a una variable carácter * que se usa internamente strtok_r() para tener en cuenta el contexto entre llamadas posteriores al analizar la misma cadena.

En primera llamada strtok_r() significado cadena debe apuntar a la cadena que se está analizando y el valor guardarptr ignorado. En llamadas posteriores el valor cadena debe ser NULL y el valor guardarptr no debe cambiar desde la convocatoria anterior.

Se pueden analizar diferentes filas simultáneamente en múltiples ejecuciones strtok_r() con diferentes argumentos guardarptr.

VALOR DEVUELTO

Funciones strtok() Y strtok_r() devuelve un puntero al siguiente token o NULL si no hay más tokens.

ATRIBUTOS

Para obtener una descripción de los términos de esta sección, consulte atributos(7).
Interfaz Atributo Significado
strtok() inofensividad en hilosinseguro (MT-carrera insegura: strtok)
strtok_r() inofensividad en hilosinofensivo (MT-Safe)

CUMPLIMIENTO

strtok() POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD. strtok_r() POSIX.1-2001, POSIX.1-2008.

DEFECTOS

Utilice estas funciones con precaución. Tenga en cuenta que: * Estas funciones modifican su primer argumento. * Estas funciones no se pueden utilizar con cadenas constantes. * Se pierde la identidad del byte separador. * Al analizar la función. strtok() utiliza un búfer estático y, por lo tanto, no es seguro para subprocesos. Usar strtok_r() en este caso.

EJEMPLO

El siguiente programa utiliza bucles anidados para llamar strtok_r() para dividir una cadena en sus tokens constituyentes. En el primer parámetro línea de comando Se especifica la cadena a analizar. El segundo parámetro especifica los bytes separadores, que se utilizan para dividir la cadena en tokens "compuestos". El tercer parámetro especifica los bytes separadores, que se utilizan para separar tokens "compuestos" en subtokens.

Ejemplo de salida del programa:

$./a.out "a/bbb///cc;xxx:yyy:" ":;" "/" 1: a/bbb///cc --> a --> bbb --> cc 2: xxx --> xxx 3: yyy --> yyy

Código fuente del programa

#incluir #incluir #incluir int main(int argc, char *argv) ( char *str1, *str2, *token, *subtoken; char *saveptr1, *saveptr2; int j; if (argc != 4) ( fprintf(stderr, "Uso: % s string delim subdelim\n", argv); exit(EXIT_FAILURE); ) for (j = 1, str1 = argv; ; j++, str1 = NULL) ( token = strtok_r(str1, argv, &saveptr1); if (token = = NULL) break; printf("%d: %s\n", j, token); for (str2 = token; ; str2 = NULL) ( subtoken = strtok_r(str2, argv, &saveptr2); if (subtoken == NULL) romper; printf(" --> %s\n", subtoken); ) ) salir(EXIT_SUCCESS); )

Otro ejemplo de un programa que utiliza strtok(), puede encontrarse en getaddrinfo_a(3).

La función strtok() devuelve un puntero al siguiente token en la cadena señalada por str1. Los caracteres que componen la cadena dirigida por str2 son los delimitadores que definen el token. Si no hay ningún token para devolver, se devuelve un puntero nulo.

En la versión C99, el calificador de restricción se aplica a los parámetros str1 y str2.

Para dividir una cadena en tokens, la primera vez que se llama a strtok(), el parámetro str1 debe apuntar al comienzo de la cadena. Las llamadas posteriores a la función deben utilizar un puntero nulo como parámetro str1. En este caso, la cadena completa se modificará cada vez que se llame a la función.

Cada llamada a la función strtok() puede utilizar un conjunto diferente de delimitadores de token.

La función strtok() proporciona un medio para reducir una cadena a sus partes constituyentes. Por ejemplo, el siguiente programa tokeniza la cadena "Uno, dos y tres".

#incluir #incluir int principal (vacío) char *p; p = strtok("Uno, dos y tres.", ","); imprimirf(p); hacer ( p = strtok(NULL, ",. "); if(p) printf("|%s", p); ) while(p), devuelve 0; )

El resultado de este programa es el siguiente.

Uno | dos | y | tres

Date cuenta cómo función strtok() se llama primero con la cadena original, pero las llamadas posteriores usan NULL como primer argumento. La función strtok() mantiene un puntero interno a la cadena que se está procesando. Si el primer argumento de strtok() apunta a una cadena, el puntero interno se establece al principio de esa cadena. Si el primer argumento es NULL, strtok() continúa procesando la cadena anterior, comenzando en la posición aprendida en el paso anterior, y avanza el puntero interno a medida que se recupera el siguiente token. Por tanto, la función strtok() "atraviesa" toda la cadena. Observe también cómo cambia la cadena delimitadora en la primera y siguientes llamadas a la función. Los delimitadores pueden definirse de manera diferente para cada llamada.

#incluir char *trazo(char * str1, carácter constante * str2);

La función strtok() devuelve un puntero al siguiente token en la cadena direccionada por el parámetro str1. Caracteres que forman la cadena direccionada por el parámetro str2, son delimitadores que definen un token. Si no hay ningún token para devolver, se devuelve un puntero nulo.

En la versión C99 a los parámetros. str1 Y str2 Se aplica el calificador de restricción.

Para dividir una cadena en tokens, la primera vez que llamas a strtok(), el parámetro str1 debe apuntar al comienzo de esta línea. En llamadas posteriores a la función como parámetro str1 necesitas usar un puntero nulo. De esta forma, toda la cadena se divide en tokens.

Cada llamada a la función strtok() puede utilizar un conjunto diferente de delimitadores.

Ejemplo

Este programa divide la cadena "La hierba es verde, el sol brilla" en fichas separadas por espacios y comas. El resultado será

La hierba|se vuelve verde|el sol|brilla #incluye #incluir int main(void) ( char *p; p = strtok("La hierba es verde, el sol brilla", " "); printf(p); do ( p = strtok("\0", ", ") ; if(p ) printf("|%s", p); ) while(p); devuelve 0; )

Sintaxis:

#incluir
char *strtok(char *str, const char *sep);

Argumentos:

str: puntero a la cadena que se va a dividir.
sep: puntero a una cadena que contiene un conjunto de caracteres delimitadores.

Valor de retorno:

NULL: si la cadena str no se puede dividir en partes.
Puntero al primer carácter de la parte seleccionada de la cadena.

Descripción:

La función strtok selecciona la siguiente parte de la cadena a la que apunta el argumento str, separada por uno de los caracteres delimitadores especificados en la cadena a la que apunta el argumento sep. Las llamadas consecutivas a la función strtok dan como resultado que la cadena str se divida en partes (tokens).

“La primera llamada a la función strtok especifica el comienzo de la cadena que se va a dividir (str) y el comienzo de la cadena que contiene los separadores (sep). La función strtok comienza revisando los caracteres de la cadena str uno a la vez y buscando un carácter que no esté contenido en la cadena delimitada sep. Si en la cadena str se encuentra el carácter de fin de línea antes de que se encontrara un carácter no incluido en la cadena sep, entonces la cadena str no se puede dividir en partes y se devuelve un puntero nulo (NULL). Si se encuentra dicho carácter, se considera que es el comienzo de la primera parte de la cadena str."

A continuación, la función strtok busca el separador, es decir, el carácter incluido en la cadena sep. Si no se encuentra dicho carácter, entonces se considera que la cadena str consta de una parte y las divisiones posteriores de la cadena str devolverán un puntero nulo. Si se encuentra tal símbolo. luego se reemplaza con un carácter nulo (carácter de fin de línea). A continuación, la función strtok recuerda la posición actual (un puntero al carácter desde el cual comenzará la búsqueda de la siguiente parte de la línea) y devuelve un puntero al comienzo de la primera parte seleccionada de la línea.

Si la función strtok devolvió un puntero no nulo, puede continuar dividiendo la cadena str en partes. Para continuar dividiendo la cadena, se vuelve a llamar a la función strtok, pero en lugar de un puntero a la cadena que se va a dividir, se especifica NULL como primer aumento. En este caso, la función strtok continuará dividiéndose desde la dirección recordada. El algoritmo de partición seguirá siendo el mismo.

Ejemplo:

En el ejemplo, la cadena "test1/test2/test3/test4" se divide en partes usando el delimitador "/" usando la función strtok. El resultado de la división se envía a la consola.

Resultado:

Salida de consola:





Arriba