2010-01-19 46 views
7

Cómo dividir una cadena en tokens por '&' en C?¿Cómo dividir una cadena en tokens en C?

+1

http://stackoverflow.com/questions/266357/tokenizing-strings-in-c –

+0

Parece que la pregunta se refiere a la división de una cadena literal (aunque la cuestión es baja en los detalles, diciendo que "no se trabajo"). Esto puede o no ser lo que el OP quiere. Deberíamos darle la oportunidad de explicar eso. ¿Se está dividiendo la cadena en una cadena literal, o es de solo lectura? –

Respuesta

10

strtok/strtok_r

char *token; 
char *state; 

for (token = strtok_r(input, "&", &state); 
    token != NULL; 
    token = strtok_r(NULL, "&", &state)) 
{ 
    ... 
} 
6

lo haría algo como esto (usando strchr()):

#include <string.h> 

char *data = "this&&that&other"; 
char *next; 
char *curr = data; 
while ((next = strchr(curr, '&')) != NULL) { 
    /* process curr to next-1 */ 
    curr = next + 1; 
} 
/* process the remaining string (the last token) */ 

strchr(const char *s, int c) devuelve un puntero a la siguiente ubicación de c en s, o NULL si c ISN' t encontrado en s.

Usted puede ser capaz de utilizar strtok(), sin embargo, no me gusta strtok(), porque:

  • modifica la cadena que se tokenizados, por lo que no funciona para las cadenas literales, o no es muy útil cuando desea mantener la cadena para otros fines. En ese caso, debe copiar la cadena a una temporal primero.
  • combina los delimitadores adyacentes, por lo que si su cadena fue "a&&b&c", los tokens devueltos son "a", "b" y "c". Tenga en cuenta que no hay un token vacío después de "a".
  • no es seguro para subprocesos.
+0

Supongo que también depende de la implementación de C. En mi sistema, la cadena en sí no se modifica cuando llamo a strtok(). En realidad, ni siquiera veo cómo podría ser. Después de todo, solo tiene que producir punteros al comienzo de los diferentes tokens dentro de la cadena. –

+0

Cees Meijer: 'strtok()' * does * modifica la cadena del argumento - los caracteres del delimitador se reemplazan por '\ 0', de modo que las cadenas devueltas terminan correctamente. – caf

+1

'strtok' * tiene * para modificar la cadena si tiene que cumplir con los estándares. Desde el estándar C: * Si se encuentra ese carácter, se sobrescribe con un carácter nulo, que termina el token actual *. Esto es muy explícito. http://opengroup.org/onlinepubs/009695399/functions/strtok.html. ¿Puedes publicar un código donde 'strtok()' no modifique la cadena? –

2

Puede usar la función strok() como se muestra en el siguiente ejemplo.

/// Function to parse a string in separate tokens 

int parse_string(char pInputString[MAX_STRING_LENGTH],char *Delimiter, 
        char *pToken[MAX_TOKENS]) 
{ 
    int i; 
    i = 0; 

    pToken[i] = strtok(pInputString, Delimiter); 
    i++; 

    while ((pToken[i] = strtok(NULL, Delimiter)) != NULL){ 
    i++; 
    } 
    return i; 
} 

/// The array pTokens[] now contains the pointers to the start of each token in the (unchanged) original string. 

sprintf(String,"Token1&Token2"); 
NrOfParameters = parse_string(String,"&",pTokens); 

sprintf("%s, %s",pToken[0],pToken[1]); 
Cuestiones relacionadas