2009-10-02 40 views
11

Estoy tratando de usar strtok() en un bucle anidado. Pero esto no me está dando los resultados deseados. Posiblemente porque están usando la misma ubicación de memoria. Mi código es de la forma: -Usando strtok() en un bucle en C?

char *token1 = strtok(Str1, "%"); 
while(token1 != NULL) 
{ 
    char *token2 = strtok(Str2, "%"); 
    while(token2 != NULL) 
    { 
     //DO SMTHING 
     token2 = strtok(NULL, "%"); 
    } 
    token1 = strtok(NULL, "%"); 
    // Do something more 
} 
+0

Así pues, ahora usted sabe por qué la gente no usa 'strtok()' si pueden evitarlo. Es difícil de usar correctamente. –

Respuesta

19

Sí, strtok(), de hecho, utiliza parte de la memoria estática para salvar su contexto entre invocaciones. Utilice una versión reentrante de strtok(), strtok_r() en su lugar, o strtok_s() si está utilizando VS (idéntico a strtok_r()).

Tiene un argumento de contexto adicional, y puede usar contextos diferentes en diferentes bucles.

char *tok, *saved; 
for (tok = strtok_r(str, "%", &saved); tok; tok = strtok_r(NULL, "%", &saved)) 
{ 
    /* Do something with "tok" */ 
} 
+2

En caso de que no edite la razón por la cual 'strtok' se comporta de esta manera, aquí hay más información sobre' strtok_r': http://www.mkssoftware.com/docs/man3/strtok_r.3.asp – Welbog

+0

@ ChrisF: El problema no es el delimitador o dónde está almacenando los tokens, sino más bien el hecho de que 'strtok' solo puede mostrar una cadena en un momento dado. 'strtok_r' resuelve este problema usando otro parámetro para registrar su estado. – Welbog

+0

¿Podría alguien explicar cómo funciona el ciclo anterior? – MortalMan

1

strtok está utilizando un búfer estático. En su caso, debe usar strtok_r. Esta función usa un buffer provisto por el usuario.

0

WayneAKing ha publicado an alternative en el Microsoft Developer Center.

citándolo:

Vaya aquí

http://cpp.snippets.org/code/

y descarga este archivo

Stptok.C mejorada tokenizing función

También puede descargar la necesaria archivos de encabezado del mismo sitio.

Esta es una versión modificada de strtok que coloca los tokens analizados (subcadenas) en un búfer independiente. Usted debería poder modificarlo a para satisfacer sus necesidades.

  • Wayne

P. S. - Tenga en cuenta que estos archivos pueden estar en formato * nix con respecto a fin de línea. es decir, - 0x0A y no 0x0D 0x0A

Esta es una alternativa si usted no tiene las bibliotecas de Microsoft en su entorno.

espero que ayuda a los demás:)