20/08/2018
La librería string.h (o cstring en C++) es una parte fundamental del lenguaje de programación C y C++, ofreciendo una colección de funciones esenciales para manipular cadenas de caracteres. A diferencia de las clases std::stringde C++, que proveen una forma más segura y orientada a objetos para la gestión de cadenas, string.h proporciona un conjunto de funciones de estilo C, más cercano al manejo de memoria manual y con una sintaxis más concisa.

Funciones principales de string.h (cstring)
string.h proporciona una gama variada de funciones para realizar diversas operaciones con cadenas, las más importantes son:
Funciones de copia
- strcpy(destino, origen): Copia la cadena
origen(incluyendo el carácter nulo) adestino. Es crucial quedestinotenga suficiente espacio asignado para evitar desbordamientos de búfer. Esta función no realiza ninguna comprobación de límites. - strncpy(destino, origen, n): Copia a lo sumo
ncaracteres de la cadenaorigenadestino. Siorigentiene menos dencaracteres, se rellenadestinocon ceros hasta alcanzarncaracteres. A diferencia destrcpy,strncpyno garantiza quedestinotermine con un carácter nulo, lo que podría causar problemas en otras funciones. - memcpy(destino, origen, n): Copia
nbytes deorigenadestino. A diferencia de las funciones de cadena anteriores,memcpytrabaja con bytes y no interpreta los datos como cadenas, por lo que no necesita un carácter nulo.
Funciones de comparación
- strcmp(cadena1, cadena2): Compara lexicográficamente las cadenas
cadena1ycadena2. Devuelve 0 si son iguales, un valor negativo sicadena1es menor quecadena2y un valor positivo sicadena1es mayor quecadena2. - strncmp(cadena1, cadena2, n): Compara a lo sumo los primeros
ncaracteres decadena1ycadena2. Similar astrcmpen su comportamiento, pero con la limitación de caracteres comparados. - memcmp(ptr1, ptr2, n): Compara
nbytes de memoria enptr1yptr2. No interpreta los datos como cadenas, por lo que es útil para comparar datos binarios.
Funciones de concatenación
- strcat(destino, origen): Concatena la cadena
origenal final de la cadenadestino. Similar astrcpy,destinodebe tener espacio suficiente para evitar desbordamientos de búfer. - strncat(destino, origen, n): Concatena a lo sumo
ncaracteres deorigenadestino. No garantiza quedestinotermine con un carácter nulo si se alcanzan losncaracteres.
Funciones de búsqueda
- strstr(cadena, subcadena): Busca la primera ocurrencia de la
subcadenadentro de lacadena. Devuelve un puntero al inicio de la subcadena si se encuentra, oNULLsi no. - strchr(cadena, carácter): Busca la primera ocurrencia del
carácterdentro de lacadena. Devuelve un puntero al carácter si se encuentra, oNULLsi no. - strrchr(cadena, carácter): Busca la última ocurrencia del
carácterdentro de lacadena. Devuelve un puntero al carácter si se encuentra, oNULLsi no.
Otras funciones
- strlen(cadena): Devuelve la longitud de la cadena (número de caracteres hasta el carácter nulo).
- strtok(cadena, delimitadores): Divide la cadena en tokens usando los caracteres especificados en
delimitadores. - memset(ptr, valor, n): Establece los primeros
nbytes de la memoria apuntada porptralvalor. Se utiliza a menudo para inicializar bloques de memoria. - strerror(código_error): Devuelve una cadena descriptiva del error dado un código de error.
Tabla comparativa: string.h vs std::string
A continuación, una tabla que compara las ventajas y desventajas de usar string.h contra la clase std::stringde C++:
| Característica | string.h | std::string |
|---|---|---|
| Seguridad | Propensa a errores; Desbordamiento de búfer | Más segura; Manejo automático de memoria y comprobación de límites |
| Manejo de Memoria | Manejo manual; Requiere asignación y liberación explícita | Automática; Administra la memoria de forma eficiente |
| Orientación a Objetos | Procedural; Funciones independientes | Orientado a Objetos; Métodos miembros |
| Facilidad de Uso | Sintaxis más concisa; pero menos intuitiva para operaciones complejas | Más intuitiva y legible; simplifica operaciones complejas |
| Rendimiento | Puede ser más rápida para operaciones simples | Generalmente más eficiente para operaciones complejas y de gran tamaño |
| Portabilidad | Alta; funciones estándar disponibles en cualquier implementación C | Alta; parte del estándar de C++ |
Consultas habituales y resolución de problemas
Algunas dudas frecuentes relacionadas con el uso de string.h son:
- ¿Cómo evitar desbordamientos de búfer? Siempre asegúrate de que la memoria de destino (variable o array) sea lo suficientemente grande para contener la cadena de origen. Usa
strncpyostrncaten lugar destrcpyostrcatcuando no estés seguro del tamaño de la cadena de origen. - ¿Por qué `strncpy` no siempre añade un carácter nulo? `strncpy` copia un máximo de n caracteres. Si la cadena origen tiene menos de n caracteres, no se agrega un carácter nulo automáticamente. Deberías añadirlo explícitamente después de usar `strncpy` si es necesario.
- ¿Cuál es la diferencia entre `strcmp` y `memcmp`? `strcmp` compara cadenas terminadas en nulo, mientras que `memcmp` compara bloques de memoria de un tamaño específico sin tener en cuenta el carácter nulo.
- ¿Cuándo usar `string.h` en lugar de `std::string`? El uso de `string.h` es generalmente desaconsejado en C++ moderno, excepto en situaciones muy específicas donde se requiere un control muy fino sobre la memoria o por razones de compatibilidad con código legado. La clase
std::stringes, en la mayoría de los casos, la mejor opción.
Conclusión
La librería string.h en C y cstring en C++ ofrece un conjunto de funciones básicas para la manipulación de cadenas de caracteres, pero su uso presenta riesgos si no se maneja con cuidado. La falta de comprobación de límites hace que sea susceptible a errores como desbordamientos de búfer. Por esta razón, en el desarrollo moderno de C++, la clase std::stringes altamente preferible por su seguridad, facilidad de uso y eficiencia en la mayoría de los casos.
Si quieres conocer otros artículos parecidos a Para qué sirve la librería string.h en c++ puedes visitar la categoría Libros y Librerías.
