Menú
Está libre
registrarse
el principal  /  Problemas / Strtok s c Descripción. Hombre Strtok_R (3): Extracción de elementos (tokens) de la cadena

STRTOK S C Descripción. Hombre Strtok_R (3): Extracción de elementos (tokens) de la cadena

4 Respuesta

Dos cosas que necesitas saber sobre Strtok. Como se mencionó, él "apoya al estado interno". Además, él estropeó la cadena que le alimentas. Esencialmente, escribirá "\\ 0", donde encontrará el marcador que ha proporcionado, y devolverá el puntero al comienzo de la línea. Internamente, apoya la ubicación del último tokeny; Y la próxima vez que lo llames, comenzará desde allí.

Una consecuencia importante es que no puede usar Strtok para un tipo de línea Const Char * "Hello World"; Ya que recibirá una violación de acceso al cambiar el contenido de la cadena Const Char *.

La "buena cosa" en Strtok es que, de hecho, no copia las líneas, por lo que no necesita controlar la asignación de memoria adicional, etc. Pero si no entiende lo anterior, tendrá problemas con su uso.

Ejemplo. Si tiene "esto, hay una cadena", las llamadas en serie Strtok generarán punteros de la siguiente manera (el valor ^ es el valor de retorno). Tenga en cuenta que se agrega el "\\ 0", donde se encuentran los tokens; Esto significa que la cadena original se cambia:

Es, es, a, a, una cadena \\ 0, esta, es, a, una cadena esta \\ 0 es, a, string \\ \\ ^ esta \\ \\ 0 es \\ a, string \\ 0 is ^ este \\ 0 es \\ 0 A \\ 0 STRING \\ 0 A ^ Esta \\ 0 es \\ 0 A \\ 0 String \\ 0 String ^

Espero que tenga sentido.

La función STRTOK () almacena los datos entre llamadas. Utiliza estos datos cuando lo llamas usando el puntero nulo.

El punto en el que se encontró el último token se almacena dentro del uso de una función que se utilizará junto a la siguiente llamada (se requiere una biblioteca específica para evitar fallas de datos).

sTRTOK apoya el estado interno. Cuando lo llamas no nulo, se vuelve a inicializar para usar la cadena que entrega. Cuando lo llamas con NULL, utiliza esta línea y cualquier otro estado, actualmente puede devolver los siguientes tokens.

Debido a cómo funciona Strtok, debe asegurarse de que se conecte con una versión multi-roscada de C Cumplimiento si escribe aplicación multi-roscada. Esto asegura que cada hilo recibirá su propio estado interno para STRTOK.

Función STRTOK almacena datos en una variable estática interna, que se distribuye entre todos los hilos.

Para garantizar la seguridad de la seguridad, debe usar STRTOK_R

Eche un vistazo a la última carta estática;

Char * strtok (s, delim) Registrarse char * s; Registrar Const Char * Delim; (Registrar char * spanp; Registrarse int C, SC; char * tok; char * último; if (s \u003d\u003d null && (s \u003d ultimo) \u003d\u003d null) devuelve (null); / * * omitir (span) liderando Delimitadores (S + \u003d STRSPN (S, DELIM), tipo de). * / Cont: C \u003d * s ++; para (spanp \u003d (char *) delim; (sc \u003d * spanp ++)! \u003d 0;) (si (C \u003d\u003d SC) goto cont;) if (c \u003d\u003d 0) (/ * no los caracteres no delimitadores * / last \u003d null; devuelva (null);) tok \u003d s - 1; / * * Token de escaneo (Escanear para delimitadores: s + \u003d strcspn (s, delim), tipo de tipo de). * Tenga en cuenta que Delim debe tener una nula; Nos detuvimos si vemos eso, también. * / Para (;) (c \u003d * s + +; Spanp \u003d (char *) delimado; haz (si (sc \u003d * spanp ++) \u003d\u003d c) (si (c \u003d\u003d 0) s \u003d nulo; else s [-1] \u003d 0; last \u003d s ; Devolución (TOK);)) MIENTRAS (SC! \u003d 0);) / * NOTROCHED * /)

Cuota

#Incluir. Char * strtok (char * str1, Const Char * str2.);

La función STRTOK () devuelve el puntero a la siguiente Lex en la cadena que se dirige al parámetro str1. Símbolos que forman una cadena direccionable por el parámetro str2.Son divisores que definen un lex. En ausencia de un lexema a devolver, se devuelve un puntero cero.

En la versión C99 a los parámetros. str1 y str2. Restringir el calificador aplicado.

Para dividir algo de cadena en los lexemes, cuando la función Strtok está llamando primero al parámetro str1 Debe apuntar al comienzo de esta línea. Tras la función de llamadas posteriores como parámetro str1 Necesitas usar un puntero cero. De esta manera, toda la línea se rompe en los lexemes.

Cada vez que se comunique con la función Strtok (), puede usar diferentes conjuntos de separadores.

Ejemplo

Este programa rompe la cadena "La hierba verde, el sol brilla" en los lexemes cuyos separadores sirven espacios y comas. Como resultado, resulta

HESTERN | Verde | Sol | Blusters #InClude #Incluir. INT principal (vacío) (char * p; p \u003d strtok ("hierba verde, brillo", ""); printf (p); hacer (p \u003d strtok ("\\ 0", ","); if (p) Printf ("|% s", p);) mientras (p); devuelva 0;)

Sintaxis:

#Incluir.
char * strtok (char * str, const char * sep20);

Argumentos:

sTR es un puntero a una cuerda rota.
SEP es un puntero a una cadena que contiene un conjunto de caracteres separadores.

Valor de devolución:

NULL - Si la cadena STR no se puede dividir en partes.
Puntero al primer carácter de la parte seleccionada de la línea.

Descripción:

La función STRTOK resalta la siguiente parte de la línea a la que se separa el argumento STR de uno de los caracteres de los separadores especificados en la cadena a la que indica el argumento SEP. La llamada en serie de la función Strtok lleva al desglose de la cadena de cadena en la parte (LEXEMES).

"Cuando llame por primera vez la función Strtok, se especifica el inicio de la cadena compartida (STR) y el comienzo de una cadena que contiene separadores (SEP). Al principio, la función STRTOK viene alternativamente a la cadena de cuerdas de cadena y busca un símbolo que no está contenido en la cadena de separadores SEP. Si está en la cadena de cadena, el símbolo de extremo de la cadena se encuentra antes de lo que el símbolo no está incluido en la cadena SEP, es imposible dividir la cadena de STR en la parte, se devuelve el puntero cero (NULL). Si se encuentra tal símbolo, se considera el comienzo de la primera parte de la cadena STR ".

A continuación, la función Strtok está buscando un separador, es decir, un símbolo incluido en la cadena SEP. Si no se encuentra un símbolo de este tipo, se cree que la cadena STR consiste en una parte y la separación posterior de la cadena de cadena devolverá el puntero cero. Si se encuentra tal símbolo. Se reemplaza con un símbolo cero (el extremo del símbolo de la línea). A continuación, la función Strtok recuerda la posición actual (el puntero al carácter al que comenzará la búsqueda de la siguiente parte de la línea) y devolverá el puntero al comienzo de la primera parte seleccionada de la línea.

Si la función STRTOK devolvió un puntero distintivo de cero, puede continuar la partición de la cadena de cadena en la parte. Para continuar dividiendo la línea, la función Strtok se vuelve a llamar, pero en lugar del puntero a la línea discontinua, NULL se especifica como el primer aumento. En este caso, la función STRTOK continuará rompiendo de la dirección memorizada. El algoritmo de la partición seguirá siendo el mismo.

Ejemplo:

En el ejemplo, la línea "test1 / test2 / test3 / test4" se divide en partes por el separador "/" usando la función STRTOK. El resultado de la partición se muestra en la consola.

Resultado:

Conclusión en la consola:


char lew * Far _fstrtok (Const Char Far * Str1, Const Char Far * Str2)

Descripción:

La función STRTOK () devuelve un puntero al siguiente lex en la cadena a la que se indica STR1. Los símbolos de la cadena de la que indica STR2 se utilizan como limitadores que determinan el Lex. Si no se encuentra el lexema, se devuelve NULL.

Durante la primera llamada de la función STRTOK (), STR1 se usa en realidad como un puntero. Con los desafíos posteriores, NULL se utiliza como primer argumento. Por lo tanto, toda la cadena se puede romper en los lexemes.

Es importante entender que la función STRTOK () modifica la cadena a la que se indica STR1. Cada vez que se encontró un lexema, en el lugar donde se encontró el limitador, se coloca un símbolo cero. Por lo tanto, Strtok () se está moviendo a lo largo de la cuerda.

Cada vez que la llamada Strtok (), puede variar el conjunto de limitadores.

La función _fstrtok () es la versión lejana de la función en cuestión.

El siguiente programa rompe la cadena "The Summer Solidier, Sunshine Patriot" con espacios y comas como limitadores. Como resultado del programa, el programa se formará la línea del siguiente tipo: "The | Verano | Soldado | El | Sol | Patriot ".
#Incluir.
#Incluir.
iNT principal (vacío)
{
char * p;
P \u003d strtok ( "El soldado de verano, el sol patriota", " " ) ;
printf (p);
hacer (
P \u003d strtok (" \0 " , ", " ) ;
if (p) printf ("|% s", p);
) Mientras (p);
return 0;
}

Otro alias.

Strtok.

INFORMACIÓN GENERAL

#Incluir.

char * strtok (char *str., Const Char *delim.);
char * strtok_r (char *str., Const Char *delim., char **saveptr.);

Prueba de propiedades Requisitos de macro para GLIBC (ver featur_test_macros.(7)):

strtok_r.(): _Svid_source || _Bsd_source || _POSIX_C_SOURCE\u003e \u003d 1 || _Xopen_source || _POSIX_SOURCE.

DESCRIPCIÓN

Función strtok.() Separa la cadena a una secuencia de cero o más tokens no vacíos. Bajo la primera llamada strtok.() La cadena analizada debe especificarse en el argumento. str.. En cada llamada posterior, que analiza la misma cadena, valor str. Debe haber nulo.

En argumento delim. Se establece un conjunto de bytes, que se consideran separadores de token en la fila analizada. La persona que llama puede indicar diferentes líneas en delim. En los desafíos posteriores al analizar la misma cadena.

Cada llamada strtok.() Devuelve un puntero a una cadena que termina con NULL, que contiene el siguiente token. Esta línea no incluye separador de byte. Si no hay más tokens, entonces strtok.() Devuelve NULL.

Secuencia de llamadas strtok.(), operando una línea, admite un puntero que determina el punto desde el cual comienza la búsqueda del siguiente token. Primer reto strtok.() Designa este puntero a la primera línea de bytes. El comienzo del siguiente token está determinado por la búsqueda hacia adelante en str. El siguiente byte no es separador. Si se encuentra el byte, se toma como el comienzo del siguiente token. Si no se encuentra un byte, no hay más tokens y strtok.() Devuelve NULL (para una cadena vacía o que consiste únicamente en separadores en este caso, NULL volverá cuando la primera llamada strtok.()).

El final de cada tokeny es una búsqueda por delante, que se encuentra hasta que se encuentra el separador de bytes o el byte final Null ("\\ 0"). Si se encuentra el separador de bytes, se sustituye por un byte nulo para completar los tokens actuales, y strtok.() Mantiene un puntero al siguiente byte; Este puntero se utilizará como punto inicial al buscar el siguiente token. En este caso strtok.() Devuelve el puntero al comienzo del tokeny encontrado.

A partir de la descripción de arriba, se deduce que la secuencia de dos o más separadores continuos bytes en la vista vista se considera un separador, y se ignoran los bytes de los divisores al principio o al final de la fila. En otras palabras, los tokens regresaron. strtok.() - Siempre no siempre las líneas vacías. Es decir, por ejemplo, si hay una cadena " aAA ;; BBB,", Luego los desafíos posteriores strtok.() Con los divisores de líneas especificadas. ;, "Devolvería las líneas" aaa"Y" bBB.", Y luego el puntero nulo.

Función strtok_r.() es una versión reintendible strtok.(). Argumento saveptr. es un puntero a la variable char *utilizado dentro strtok_r.() Explicar el contexto entre los desafíos posteriores al analizar la misma línea.

Bajo la primera llamada strtok_r.() Valor str. debe indicar la cadena analizada y el valor saveptr. ignorado. Sobre las llamadas posteriores el valor str. Debe haber nulo, y el valor. saveptr. No debe cambiar desde el momento de la llamada anterior.

Al mismo tiempo, se pueden analizar diferentes líneas en múltiples lanzamientos. strtok_r.() Con diversos argumentos. saveptr..

Valor de devolución

Funciones strtok.() I. strtok_r.() Devuelva el puntero al siguiente token o nulo, si no hay más tokens.

Atributos

Descripción de los términos de esta sección, ver atributos.(7).
Interfaz Atributo Valor
strtok.() asegurar en los hilos.inseguro (MT-Unsafe Race: Strtok)
strtok_r.() asegurar en los hilos.inofensivo (MT-SAFE)

CUMPLIMIENTO

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

Defectos

Usa estas funciones con precaución. Tenga en cuenta que: * Estas funciones cambian su primer argumento. * Estas funciones no se pueden usar con cadenas constantes. * Se pierde la identidad del separador de bytes. * Al analizar la función. strtok.() Usa un tampón estático, por lo que no es seguro para los hilos. Usar strtok_r.() en este caso.

EJEMPLO

El programa que se presenta a continuación utiliza ciclos anidados que causan strtok_r.() Para dividir la cadena a los componentes de sus tokens. En el primer parámetro línea de comando Se establece la cadena analizada. En el segundo parámetro, el byte (s) es un separador que se usa para dividir la cadena a los tokens "compuestos". El tercer parámetro indica bytes (s): el separador, que se usa para separar los tokens "compuestos" en el fértil.

Ejemplo de los resultados de la salida del programa:

$ ./A.OUT "A / BBB /// CC; XXX: YYY:" ":" "/" 1: A / BBB /// CC -\u003e A -\u003e BBB -\u003e CC 2: XXX -\u003e XXX 3: YYY -\u003e YYY

Programa de código fuente

#Incluir. #Incluir. #Incluir. INT principal (int argc, char * argv) (char * str1, * str2, * token, * subtoken; char * sakeptr1, * saveptr2; int j; if (argc! \u003d 4) (fprintf (stderr ", use:% s cadena de Subdelim \\ N ", argv); salida (exit_failure);) para (j \u003d 1, str1 \u003d argv ;; j ++, str1 \u003d null) (token \u003d strtok_r (STR1, ARGV, & SAVEPTR1); si (token \u003d \u003d null) break; printf ("% d:% s \\ n", j, token); para (str2 \u003d token; str2 \u003d null) (Subtoken \u003d strtok_r (STR2, ARGV, & SAVEPT2); si (Subtoken \u003d\u003d null) Break; printf ("-\u003e% s \\ n", subtime);) salida (exit_success);)

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