2008-11-27 42 views
7

estoy trabajando con C y por medio de un enchufe que va a recibir un mensaje con un espacio en ella, tengo que dividir la cadena en partes en el espacio. ¿Cómo voy a hacer esto?Separar una cadena por el espacio en C

+0

que respondieron a esta pregunta en otro post [aquí] [1]. [1]: http://stackoverflow.com/a/22118068/3368887 –

Respuesta

14

strtok_r es su amigo.

No utilice llanura strtok(), ya que no es seguro para subprocesos.

Incluso en plataformas donde es seguro para subprocesos (porque el estado se almacena en Thread-Local Storage), sigue existiendo el problema de que el uso del estado interno significa que no puede analizar tokens de varias cadenas simultáneamente.

por ejemplo, si se escribe una función que utiliza strtok() para separar la cadena A, su función no se puede llamar dentro del bucle de una segunda función que está utilizando strtok() para dividir la cadena B.

+0

Este puede ser el caso en algunas plataformas, pero no es el caso con MSVC. strtok es seguro para subprocesos, al igual que las otras funciones de CRT que tradicionalmente utilizan almacenamiento estático. –

+0

@Will - actualizado. Si lo tengo bien, su uso de TLS todavía significa que no se puede strtokking simultáneamente dos cadenas ... – Roddy

0

Esto se hace generalmente usando la llamada a la biblioteca strtok(). Se advirtió, sin embargo, que esta función va a modificar la cadena de entrada (se inserta '\ 0' caracteres NUL en todas partes que se encontró el delimitador elegido) - por lo que es posible que desee llamar strtok() en una copia de la cadena si es necesario acceda a todo el asunto más tarde.

EDIT: como se ha mencionado por otro cartel, strtok "normal"() no es seguro para subprocesos, por lo strtok_r() es la función más seguro para llamar. No estoy seguro de si strtok_r() tiene el mismo problema de modificar el búfer de entrada en el lugar.

+0

strtok_r es, sin embargo, una función de Posix. puede no estar disponible en Windows. –

+0

Microsoft strtok * es * seguro para subprocesos y lo ha estado por el tiempo que puedo recordar. Los datos "estáticos" se guardan en el almacenamiento local de subprocesos. –

+1

strtok() en MS puede ser seguro para subprocesos, pero no es reentrante; solo un bit de código puede usarlo a la vez. Es decir, no puede tener FunctionA() usando strtok() para analizar una cadena y hacer que llame a FunctionB() donde FunctionB() también llama a strtok() para analizar una cadena diferente. ¡La función A() está ahora atornillada! –

5

Si posee el búfer de cadena, y sabe que es seguro modificarlo, puede usar strtok_r() como lo han sugerido las personas. O bien, podría hacerlo usted mismo, de esta manera:

char buffer[2048]; 
char *sp; 

/* read packet into buffer here, omitted */ 

/* now find that space. */ 
sp = strchr(buffer, ' '); 
if(sp != NULL) 
{ 
    /* 0-terminate the first part, by replacing the space with a '\0'. */ 
    *sp++ = '\0'; 
    /* at this point we have the first part in 'buffer', the second at 'sp'. 
} 

Esto puede ser más rápido y/o más fácil de entender, dependiendo del contexto.

Cuestiones relacionadas