C
Tutorial C: Arrays y manejo de cadenas
C aprende a declarar y usar arrays unidimensionales de forma óptima en tus programas. Optimiza el manejo de datos con esta lección.
Aprende C GRATIS y certifícateDeclaración y uso de arreglos unidimensionales
Un array unidimensional en C es una secuencia de elementos del mismo tipo, almacenados de manera contigua en memoria y accesibles mediante un índice basado en cero. Dado que cada elemento se guarda de forma adyacente, conocer la posición exacta permite un acceso rápido a cada valor.
Para la declaración de un array, se indica el tipo de dato y el número de elementos entre corchetes. Por ejemplo:
int numeros[5];
Este ejemplo reserva espacio para 5 enteros consecutivos en memoria. Cada posición se referirá como numeros[0]
, numeros[1]
y así sucesivamente.
En la inicialización de un array, se puede asignar una lista de valores entre llaves. Así, en el momento de la declaración podemos hacer:
int valores[3] = {10, 20, 30};
Este ejemplo ubica los valores 10, 20 y 30 en las posiciones valores[0]
, valores[1]
y valores[2]
. Si se omite parte de la lista, C completa el resto con ceros.
También es posible dejar vacío el número de elementos al definir un array para que se ajuste automáticamente al número de inicializadores:
float decimales[] = {1.5f, 2.5f, 3.5f};
De esta manera, se dimensiona el array para almacenar exactamente tres valores. Aun así, conviene indicar explícitamente el tamaño cuando se busca mayor claridad.
Acceder o modificar elementos se realiza mediante un índice que indica la posición. En un bucle, se puede recorrer fácilmente el array:
for (int i = 0; i < 3; i++) {
printf("Elemento %d: %.2f\n", i, decimales[i]);
}
Es fundamental respetar el rango de índices para evitar desbordamientos que puedan provocar comportamientos indeterminados. Por lo general, verificar condiciones de límite o usar constantes simbólicas minimiza este tipo de errores.
En situación de lectura desde teclado, se puede emplear un bucle para almacenar datos:
#include <stdio.h>
int main(void) {
int calificaciones[5];
for(int i = 0; i < 5; i++) {
scanf("%d", &calificaciones[i]);
}
return 0;
}
Así, cada elemento puede gestionarse individualmente sin necesidad de variables independientes. Este enfoque permite procesar grandes cantidades de datos de forma sistemática.
Arrays multidimensionales
Un array multidimensional en C se concibe como un conjunto de arreglos anidados, todos del mismo tipo, organizados en memoria de forma contigua en row-major. Esta organización implica que los elementos de la primera dimensión se alinean secuencialmente, seguidos de los de la segunda, y así sucesivamente.
Para declarar un array bidimensional que represente, por ejemplo, datos en filas y columnas, puede usarse:
int matriz[3][4];
Aquí se reservan 3 filas y 4 columnas de tipo int, almacenadas de forma lineal según la convención de C. Cada elemento se identifica por su posición, como matriz[fila][columna]
.
La inicialización se puede realizar con llaves anidadas. Por ejemplo:
int tabla[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
Cada bloque entre llaves se asocia a una fila, mientras que los valores individuales ocupan posiciones consecutivas siguiendo el orden establecido. Si se omite parte de la lista de inicializadores, el compilador completa los huecos con ceros.
Cuando se accede a un array multidimensional, se suelen emplear bucles anidados para recorrer cada nivel de la estructura. Por ejemplo:
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", tabla[i][j]);
}
printf("\n");
}
Cada índice indica la dimensión que se desea acceder, reduciendo la necesidad de múltiples variables independientes y facilitando la gestión de datos tabulares.
Los arrays pueden tener más de dos dimensiones, aunque en la práctica los más comunes suelen ser los bidimensionales. Para reservar espacio en un array tridimensional, se indicaría el tamaño en cada dimensión, por ejemplo:
float cubo[2][3][4];
De esta manera, se gestionan múltiples niveles de información, anidando los conjuntos según la necesidad de la aplicación. Con cada nueva dimensión, se incrementa el total de elementos, por lo que es aconsejable definir tamaños apropiados para evitar un consumo excesivo de memoria.
Manejo de strings en C
Las cadenas en C se representan utilizando arreglos de caracteres terminados con un carácter nulo ('\0'
). Este carácter marca el final de la cadena y permite que las funciones de <string.h>
identifiquen dónde termina el texto. Manejar adecuadamente el terminador es esencial para evitar lecturas fuera de rango.
La mayoría de las funciones de manipulación de cadenas requieren incluir string.h
. A continuación, se explican algunas de las funciones más comunes, junto con ejemplos prácticos.
strlen()
: Obtener la longitud de una cadena
La función strlen()
devuelve la longitud real de la cadena sin contar el '\0'
. Por ejemplo:
#include <stdio.h>
#include <string.h>
int main(void) {
char frase[] = "Hola C";
int longitud = strlen(frase); // 6
printf("Longitud: %d\n", longitud);
return 0;
}
En este caso, se imprime el número total de caracteres visibles en la variable frase
.
strcpy()
y strncpy()
: Copiar cadenas
La función strcpy()
transfiere el contenido de la fuente (src
) a la cadena destino (dest
). Es fundamental que la cadena destino tenga suficiente espacio para almacenar todos los caracteres más el terminador nulo. Si deseas limitar el número de caracteres copiados, utiliza strncpy()
.
Ejemplo con strcpy()
y strncpy()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char origen[] = "Programación en C";
char destino1[20];
char destino2[10];
strcpy(destino1, origen); // Copia completa
strncpy(destino2, origen, 9); // Copia los primeros 9 caracteres
destino2[9] = '\0'; // Asegura el terminador nulo
printf("Destino 1: %s\n", destino1);
printf("Destino 2: %s\n", destino2);
return 0;
}
strcat()
y strncat()
: Concatenar cadenas
La función strcat()
añade la segunda cadena al final de la primera. Para evitar desbordamientos, se recomienda usar strncat()
, que permite especificar un número máximo de caracteres a concatenar.
Ejemplo con strcat()
y strncat()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char saludo[30] = "Hola";
char nombre[] = " Mundo";
strcat(saludo, nombre); // Concatena completo
printf("Concatenado completo: %s\n", saludo);
char saludo2[30] = "Hola";
strncat(saludo2, nombre, 3); // Concatena los primeros 3 caracteres
printf("Concatenado parcial: %s\n", saludo2);
return 0;
}
strcmp()
y strncmp()
: Comparar cadenas
La función strcmp()
compara dos cadenas y devuelve un valor negativo, cero o positivo dependiendo del orden lexicográfico. Para comparar solo los primeros caracteres, se usa strncmp()
.
Ejemplo con strcmp()
y strncmp()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char cadena1[] = "Hola";
char cadena2[] = "hola";
int resultado = strcmp(cadena1, cadena2);
if (resultado == 0) {
printf("Las cadenas son iguales.\n");
} else if (resultado < 0) {
printf("'%s' es menor que '%s'.\n", cadena1, cadena2);
} else {
printf("'%s' es mayor que '%s'.\n", cadena1, cadena2);
}
// Comparar solo los primeros 3 caracteres
if (strncmp(cadena1, cadena2, 3) == 0) {
printf("Las primeras 3 letras son iguales.\n");
} else {
printf("Las primeras 3 letras son diferentes.\n");
}
return 0;
}
snprintf()
: Formatear cadenas con precisión
La función snprintf()
permite escribir una cadena formateada en un buffer, especificando la longitud máxima que se debe escribir. Esto previene desbordamientos en el buffer.
Ejemplo con snprintf()
:
#include <stdio.h>
int main(void) {
char buffer[50];
int edad = 25;
snprintf(buffer, sizeof(buffer), "Tengo %d años.", edad);
printf("Mensaje formateado: %s\n", buffer);
return 0;
}
En este ejemplo, el mensaje se compone de una cadena fija y un valor numérico (edad
), asegurándose de no exceder el tamaño del buffer.
Todas las lecciones de C
Accede a todas las lecciones de C y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Css
Introducción Y Entorno
Sintaxis
Sintaxis De Selectores Y Propiedades
Selectores Básicos
Sintaxis De Selectores Y Propiedades
Herencia Y Cascada
Sintaxis De Selectores Y Propiedades
Pseudo-clases Y Pseudo-elementos
Sintaxis De Selectores Y Propiedades
Estilos De Fuente
Estilización De Texto Y Fondo
Propiedades De Texto
Estilización De Texto Y Fondo
Sombras En Texto Y Cajas
Estilización De Texto Y Fondo
Propiedades De Fondo
Estilización De Texto Y Fondo
Modelo De Caja
Modelo Caja Y Posicionamiento
Propiedades De Posicionamiento
Modelo Caja Y Posicionamiento
Propiedad 'Display'
Modelo Caja Y Posicionamiento
Elementos 'Float' Y 'Clear'
Modelo Caja Y Posicionamiento
Flexbox Para Crear Layouts Y Estructuras
Flexbox Y Grid
Css Grid Para Crear Layouts Y Estructuras
Flexbox Y Grid
Animaciones Y Transiciones
Técnicas Modernas Y Metodologías
Variables En Css
Técnicas Modernas Y Metodologías
Diseño Responsive Con Media Queries
Técnicas Modernas Y Metodologías
Metodologías De Escritura En Css
Técnicas Modernas Y Metodologías
Introducción A Javascript
Sintaxis
Tipos De Datos
Sintaxis
Variables
Sintaxis
Operadores
Sintaxis
Estructuras De Control
Sintaxis
Funciones
Sintaxis
Funciones Cierre (Closure)
Sintaxis
Funciones Flecha
Programación Funcional
Filtrado Con Filter() Y Find()
Programación Funcional
Transformación Con Map()
Programación Funcional
Reducción Con Reduce()
Programación Funcional
Clases Y Objetos
Programación Orientada A Objetos
Excepciones
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Array
Estructuras De Datos
Conjuntos Con Set
Estructuras De Datos
Mapas Con Map
Estructuras De Datos
Manipulación Dom
Dom
Selección De Elementos Dom
Dom
Modificación De Elementos Dom
Dom
Eventos Del Dom
Dom
Callbacks
Programación Asíncrona
Promises
Programación Asíncrona
Async / Await
Programación Asíncrona
Introducción A Typescript
Introducción Y Entorno
Variables Y Constantes
Sintaxis
Operadores
Sintaxis
Control De Flujo
Sintaxis
Funciones
Sintaxis
Funciones Flecha
Sintaxis
Clases Y Objetos
Programación Orientada A Objetos
Interfaces
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Inmutabilidad
Programación Funcional
Funciones Puras
Programación Funcional
Funciones De Primera Clase
Programación Funcional
Funciones De Alto Orden
Programación Funcional
Tipos Literales
Tipos De Datos Avanzados
Tipos Genéricos
Tipos De Datos Avanzados
Tipos De Unión E Intersección
Tipos De Datos Avanzados
Tipos De Utilidad
Tipos De Datos Avanzados
Módulos
Namespaces Y Módulos
Namespaces
Namespaces Y Módulos
Resolución De Módulos
Namespaces Y Módulos
Introducción A C#
Sintaxis
Creación De Proyecto C#
Sintaxis
Variables Y Constantes
Sintaxis
Tipos De Datos
Sintaxis
Operadores
Sintaxis
Control De Flujo
Sintaxis
Funciones
Sintaxis
Clases Y Encapsulación
Programación Orientada A Objetos
Objetos
Programación Orientada A Objetos
Constructores Y Destructores
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Excepciones
Excepciones
Arrays Y Listas
Colecciones Y Linq
Diccionarios
Colecciones Y Linq
Conjuntos, Colas Y Pilas
Colecciones Y Linq
Uso De Consultas Linq
Colecciones Y Linq
Delegados
Programación Asíncrona
Eventos
Programación Asíncrona
Lambdas
Programación Asíncrona
Uso De Async Y Await
Programación Asíncrona
Tareas
Programación Asíncrona
Introducción A C
Introducción Y Entorno
Primer Programa En C
Introducción Y Entorno
Estructura Básica De Un Programa En C
Sintaxis
Operadores Y Expresiones
Sintaxis
Control De Flujo
Sintaxis
Arrays Y Manejo De Cadenas
Sintaxis
Funciones
Funciones Y Punteros
Punteros
Funciones Y Punteros
Gestión De Memoria Dinámica
Funciones Y Punteros
Estructuras En C
Estructuras, Uniones Y Tipos
Uniones Y Enumeraciones
Estructuras, Uniones Y Tipos
Introducción A Tailwind Css
Introducción Y Entorno
Instalación De Tailwind Css
Introducción Y Entorno
Fundamentos Del Sistema De Utility-first
Fundamentos
Fundamentos Del Diseño Responsive
Fundamentos
Tipografía Y Fuentes En Tailwind Css
Clases De Utilidad
Clases De Tamaño De Tailwind Css
Clases De Utilidad
Utilidades De Espaciado Y Alineación De Tailwind Css
Clases De Utilidad
Clases De Colores Y Fondo De Tailwind Css
Clases De Utilidad
Clases De Bordes De Tailwind Css
Clases De Utilidad
Hover, Focus Y Estado De Tailwind Css
Clases De Utilidad
Transiciones Y Animaciones De Tailwind Css
Clases De Utilidad
Contenedores Y Columnas En Tailwind Css
Layout
Flexbox En Tailwind Css
Layout
Grid En Tailwind Css
Layout
Evaluación Test Tailwind Css
Evaluación
Evaluación Código Tailwind Css
Evaluación
Introducción A React Y Su Ecosistema
Introducción Y Entorno
Instalar React Y Crear Nuevo Proyecto
Introducción Y Entorno
Introducción A Jsx
Componentes
Introducción A Componentes
Componentes
Componentes Funcionales
Componentes
Eventos En React
Componentes
Props Y Manejo De Datos Entre Componentes
Componentes
Renderizado Condicional
Componentes
Renderizado Iterativo Con Bucles
Componentes
Manejo De Clases Y Estilos
Componentes
Introducción A Los Hooks
Hooks
Estado Y Ciclo De Vida De Los Componentes
Hooks
Hooks Estado Y Efectos Secundarios
Hooks
Hooks Para Gestión De Estado Complejo Y Contexto
Hooks
Hooks Optimización Y Concurrencia
Hooks
Introducción A React Router
Navegación Y Enrutamiento
Definición Y Manejo De Rutas
Navegación Y Enrutamiento
Rutas Anidadas Y Rutas Dinámicas
Navegación Y Enrutamiento
Navegación Programática Redirección
Navegación Y Enrutamiento
Nuevos Métodos Create De React Router
Navegación Y Enrutamiento
Solicitudes Http Con Fetch Api
Interacción Http Con Backend
Solicitudes Http Con Axios
Interacción Http Con Backend
Estado Local Con Usestate Y Usereducer
Servicios Y Gestión De Estado
Estado Global Con Context Api
Servicios Y Gestión De Estado
Estado Global Con Redux Toolkit
Servicios Y Gestión De Estado
Custom Hooks Para Servicios Compartidos
Servicios Y Gestión De Estado
Evaluación Test React
Evaluación
Aprendizaje Automático
Introducción Y Entorno
Introducción E Instalación
Introducción Y Entorno
Introducción Al Preprocesamiento De Datos
Preprocesamiento De Datos
Identificación Y Tratamiento De Valores Faltantes
Preprocesamiento De Datos
Escalado De Datos
Preprocesamiento De Datos
Normalización De Datos
Preprocesamiento De Datos
Codificación De Variables Categóricas
Preprocesamiento De Datos
Ingeniería De Características
Preprocesamiento De Datos
Selección De Características
Preprocesamiento De Datos
Extracción De Características
Preprocesamiento De Datos
Particionamiento De Datos
Preprocesamiento De Datos
Preprocesamiento De Datos Desbalanceados
Preprocesamiento De Datos
Introducción A La Regresión
Regresión
Regresión Lineal
Regresión
Regresión Knn Kneighborsregressor
Regresión
Regresión Svm Con Svr
Regresión
Regresión Con Árboles Decisiontreeregressor
Regresión
Regresión Con Algoritmos De Conjunto
Regresión
Introducción A La Clasificación
Clasificación
Clasificación Con Regresión Logística
Clasificación
Clasificación Knn Kneighborsclassifier
Clasificación
Clasificación Svm Con Svc
Clasificación
Clasificación Con Árboles Decisiontreeclassifier
Clasificación
Clasificación Con Algoritmos De Conjunto
Clasificación
Reducción De La Dimensionalidad Con Pca
Aprendizaje No Supervisado
Clustering Con Kmeans
Aprendizaje No Supervisado
Clustering Jerárquico
Aprendizaje No Supervisado
Clustering De Densidad Con Dbscan
Aprendizaje No Supervisado
Preprocesamiento De Textos Para Nlp
Nlp
Representación De Texto Y Extracción De Características
Nlp
Clasificación De Texto Con Scikit Learn
Nlp
Análisis De Sentimiento
Nlp
Técnicas Avanzadas De Extracción De Características
Nlp
Introducción Al Análisis De Series Temporales
Series Temporales
Preprocesamiento De Datos De Series Temporales
Series Temporales
Ingeniería De Características Para Series Temporales
Series Temporales
Transformación Y Escalado De Series Temporales
Series Temporales
Validación Y Evaluación De Modelos En Series Temporales
Series Temporales
Validación Y Evaluación De Modelos
Validación De Modelos
Técnicas De Validación Cruzada
Validación De Modelos
Métricas De Regresión
Validación De Modelos
Métricas De Clasificación
Validación De Modelos
Ajuste De Hiperparámetros
Validación De Modelos
Introducción A Pipelines
Pipelines Y Despliegue
Creación De Pipelines Básicos
Pipelines Y Despliegue
Preprocesamiento De Datos Con Pipelines
Pipelines Y Despliegue
Pipelines Y Validación Cruzada
Pipelines Y Despliegue
Pipelines Con Columntransformer
Pipelines Y Despliegue
Exportar E Importar Pipelines
Pipelines Y Despliegue
Introducción E Instalación De Opencv
Introducción Y Entorno
Carga Y Visualización De Imágenes
Manipulación Imágenes
Operaciones Básicas En Imágenes
Manipulación Imágenes
Detección De Bordes Y Contornos
Procesamiento Y Análisis
Histograma Y Ecualización
Procesamiento Y Análisis
Preprocesamiento Para Machine Learning
Aprendizaje Automático
Clasificación De Imágenes Con Ml
Aprendizaje Automático
Introducción A Docker
Introducción Y Entorno Docker
Instalación De Docker
Introducción Y Entorno Docker
Descargar Imágenes De Hub.docker.com
Imágenes Docker
Crear Imágenes Con Dockerfile
Imágenes Docker
Contenedores Docker
Contenedores Docker
Volúmenes Docker
Volúmenes Docker
Redes Docker
Redes Docker
Creación De Archivos Docker Compose
Docker Compose
Docker Compose Para Varios Servicios
Docker Compose
Certificados de superación de C
Supera todos los ejercicios de programación del curso de C y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.
Control de versiones con Git
5h 0m
Programación con HTML
10h 0m
Programación con CSS
10h 0m
Programación con JavaScript
20h 0m
Programación con TypeScript
20h 0m
Programación con Python
20h 0m
Programación con Java
20h 0m
Programación con Kotlin
20h 0m
Programación con C#
20h 0m
Programación con Go
20h 0m
Consola de comandos Linux Bash
15h 0m
Bases de datos con SQL
20h 0m
Frontend con Bootstrap CSS
10h 0m
Frontend con Tailwind CSS
10h 0m
Frontend con Angular
30h 0m
Frontend con React
30h 0m
Frontend con Vuejs
30h 0m
Frontend básico: HTML, CSS y JavaScript
40h 0m
Frontend avanzado: HTML, CSS, JS, TS, Angular
90h 0m
Backend NestJS
30h 0m
Backend Spring Boot
30h 0m
Backend Hibernate ORM
30h 0m
Backend: Java y Spring Boot
50h 0m
Backend: TypeScript y NestJS
50h 0m
Full Stack: Spring Boot y Angular
120h 0m
Full Stack: NestJS y Angular
100h 0m
Ciencia de datos con Numpy con Python
15h 0m
Ciencia de datos con Pandas con Python
20h 0m
Análisis de datos y visualización con Matplotlib
15h 0m
Análisis de datos y visualización con Seaborn
10h 0m
Docker y Docker Compose
10h 0m
Objetivos de aprendizaje de esta lección
- Declarar arrays unidimensionales.
- Inicializar y modificar datos de arrays.
- Utilizar bucles para recorrer arrays.
- Declarar y manejar arrays multidimensionales.
- Aplicar funciones de la biblioteca
<string.h>
para manipular cadenas.