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
Respuesta
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.
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. –
@Will - actualizado. Si lo tengo bien, su uso de TLS todavía significa que no se puede strtokking simultáneamente dos cadenas ... – Roddy
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.
strtok_r es, sin embargo, una función de Posix. puede no estar disponible en Windows. –
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. –
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! –
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.
- 1. Separar una cadena por espacios
- 2. Separar una cadena por espacios en blanco en C++
- 3. Separar una cadena en el primer espacio de ocurrencia blanco
- 4. Separar una cadena por el delimitador
- 5. Separar una cadena en C#, el espacio vacío también se considera como una cadena de cómo desechar de cadena vacía
- 6. Separar una cadena por un carácter
- 7. Separar una cadena en frases
- 8. Separar una cadena basado en expresiones regulares
- 9. Separar una cadena en enteros utilizando istringstream en C++
- 10. C - Separar una cadena en una matriz de cadenas
- 11. Separar cadena en una matriz de caracteres en C++
- 12. ¿Separar una cadena en Ruby, ignorando el contenido de paréntesis?
- 13. Eliminar el espacio en una cadena en C#
- 14. actuaciones Separar una cadena Java
- 15. Separar una cadena con mayúsculas
- 16. ¿Separar cadena una vez en javascript?
- 17. Python Separar una cadena en la ventana
- 18. Separar una cadena en cadenas de elementos
- 19. Separar cadena en la matriz
- 20. C#: Separar una cadena y el resultado de asignación de múltiples variables de cadena
- 21. Separar una cadena en un número, conservando el número
- 22. Rubí Separar una cadena con expresiones regulares
- 23. cmd- coma para separar los parámetros ¿Comparado con el espacio?
- 24. Separar una cadena con múltiples espacios
- 25. Separar cadena en una matriz de cadenas de caracteres
- 26. C# - Separar una cadena por cualquier número de fichas y espacios
- 27. Separar una cadena con la fiesta con el símbolo
- 28. Separar una cadena y obtener el primer valor sólo
- 29. Separar una cadena supresión de todos los campos nulos
- 30. Javascript: Separar una cadena en una matriz 2D
que respondieron a esta pregunta en otro post [aquí] [1]. [1]: http://stackoverflow.com/a/22118068/3368887 –