Cadenas en C hechas fáciles: Declaración, entrada, salida y funciones de biblioteca
¿Qué es una cadena en C?
Una cadena en C es una secuencia contigua de caracteres terminada por el carácter nulo (\0). Aunque el lenguaje no tiene un tipo de cadena dedicado, una cadena se representa usualmente como un array de valores char. El compilador añade automáticamente el terminador nulo cuando inicializas un literal de cadena.
"¡Bienvenido al mundo de la programación!"
Declaración e inicialización de cadenas
Puesto que C trata una cadena como un array de caracteres, debes especificar el tamaño del array. El tamaño define el número máximo de caracteres (excluyendo el terminador nulo) que se pueden almacenar.
char nombre_variable_cadena[tamaño_array];
Declaraciones típicas:
char primer_nombre[15]; /* almacena hasta 14 caracteres + \0 */ char apellido[15];
Cuando proporcionas un inicializador, el compilador cuenta los caracteres y añade automáticamente el terminador nulo. El tamaño del array puede omitirse si das un inicializador.
char primer_nombre[15] = "ANTONIO"; char primer_nombre[] = "NATHAN"; /* tamaño inferido */ char cadena3[6] = {'h','o','l','a','\0'}; /* terminador explícito */
Lectura de cadenas desde el usuario
Las funciones de entrada varían en seguridad y comportamiento:
scanf("%s", nombre)lee hasta espacio en blanco pero es vulnerable a desbordamiento de búfer.gets()lee una línea completa pero es insegura y eliminada en C11.fgets(nombre, tamaño, stdin)lee hastatamaño-1caracteres, dejando espacio para el terminador nulo.
Ejemplo usando fgets:
#include <stdio.h> int main() { char nombre[50]; printf("Ingrese su nombre completo: "); fgets(nombre, sizeof(nombre), stdin); printf("Su nombre es %s", nombre); return 0; }
Impresión de cadenas
La forma clásica de mostrar una cadena es printf("%s", nombre);. Dos alternativas convenientes son:
fputs(nombre, stdout)– escribe directamente en el flujo de salida.puts(nombre)– escribe la cadena seguida de una nueva línea.
Ejemplo con puts:
#include <stdio.h> int main() { char saludo[] = "¡Hola, mundo!"; puts(saludo); return 0; }
La biblioteca de cadenas (<string.h>)
Funciones comúnmente usadas:
| Función | Descripción |
|---|---|
| strlen | Devuelve la longitud de una cadena (excluyendo el terminador nulo). |
| strcat | Anexa una cadena a otra. |
| strcmp | Compara dos cadenas lexicográficamente. |
| strcpy | Copia una cadena. |
| strncmp | Compara hasta n caracteres. |
| strncpy | Copia hasta n caracteres. |
| strchr | Encuentra la primera ocurrencia de un carácter. |
| strrchr | Encuentra la última ocurrencia de un carácter. |
| strstr | Encuentra una subcadena. |
| strncat | Concatena hasta n caracteres. |
| strlwr | Convierte a minúsculas (no estándar). |
| strupr | Convierte a mayúsculas (no estándar). |
| strrev | Invierte una cadena (no estándar). |
Programa ilustrativo:
#include <stdio.h> #include <string.h> int main() { char str1[20] = "Hola"; char str2[20] = " Mundo!"; char resultado[40]; /* Comparación */ if (strcmp(str1, str2) == 0) puts("Las cadenas son iguales"); else puts("Las cadenas no son iguales"); /* Concatenación */ strcat(str1, str2); // str1 ahora contiene "Hola Mundo!" printf("Concatenada: %s\n", str1); /* Longitud */ printf("Longitud de str1: %zu\n", strlen(str1)); /* Copia */ strcpy(resultado, str1); printf("Cadena copiada: %s\n", resultado); return 0; }
Conversión de cadena a número
Conversiones estándar:
atoi– convierte aint.atof– convierte adouble.atol– convierte along.
Ejemplo con atoi:
#include <stdio.h> #include <stdlib.h> int main() { char numero_str[20]; printf("Ingrese un número: "); fgets(numero_str, sizeof(numero_str), stdin); int num = atoi(numero_str); printf("Ingresaste %d\n", num); return 0; }
Conclusiones clave
- Una cadena es una secuencia de caracteres almacenada en un array
charterminada por \0. - Declara el tamaño del array antes de usarlo, o deja que el compilador lo infiera al inicializar.
- Usa
fgetspara entrada segura; evitagetsyscanf("%s")sin verificación de límites. - Aprovecha
<string.h>para operaciones robustas con cadenas. - Convierte números en cadena con
atoi,atofoatolpara evitar errores en tiempo de ejecución. - Recuerda que los literales de cadena son de solo lectura; modificarlos conduce a comportamiento indefinido.
Lenguaje C
- Arrays en C++: Declaración, inicialización y técnicas con punteros
- Dominando funciones de cadena en C++: strcpy, strcat, strlen, strcmp – Ejemplos prácticos
- Uso de realloc() en C: Sintaxis, mejores prácticas y ejemplo
- Dominando la función free() en C: Guía práctica y ejemplo
- Cadenas en C#: Mejores prácticas y consejos
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Domine las Operaciones de Strings en Python: Replace, Join, Split, Reverse y Conversión de Mayúsculas/Minúsculas
- Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
- Dominando representaciones String en Enums de Java
- Método Java String length(): Cómo obtener el tamaño de un String (Ejemplo)
- Clase String en Java: Dominando Creación y Manipulación de Cadenas