Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5...

12
Tema 9. Vectores y Matrices OBJETIVO En temas anteriores hemos declarado variables simples de tipo int, float, o de cualquier otro tipo sim- ple. A menudo necesitaremos declarar una colección de variables, tales como 20 enteros. En este tema veremos cómo podemos declarar arrays vectores y matrices, que reciben el nombre genérico de arrays. Por otro lado, C no tiene datos predefinidos tipo cadena. En su lugar, C manipula cadenas de caracteres mediante arrays de caracteres que terminan con el carácter nulo ASCII ('\0'). Una cadena se considera como un vector de tipo char o unsigned char. Bibliografía Joyanes Aguilar, J. “Programación en C++. Algoritmos, estructuras de datos y Objetos”. Capítulos 7 y 9. Ed. McGraw-Hill. Pont, M.J. “Software Engineering with C++ and CASE Tools”. Capítulo 7. Pointers and arrays. Ed. Addison-Wesley. CONTENIDOS 1. ¿Qué es un Array? 1 1.1. Elementos de un Array 2 1.2. Declaración de arrays 3 1.3. Asignación de valores fuera del array 4 1.4. Inicialización de un array 6 2. Matrices (arrays multidimensionales) 6 2.1. Inicialización de arrays multidimensionales 7 3. Cadena de caracteres 9 3.1. Lectura de cadenas 10 3.2. Manejo de cadenas 11 1. ¿Qué es un Array? Un array es una colección de posiciones de almacenamiento de datos, todos ellas con el mismo tipo de dato. Cada posición de almacenamiento se denomina elemento del array. Denominaremos vector a un array unidimensional, y matriz a un array multidimensional. Para declarar un vector escribimos el tipo de dato, seguido del nombre del vector y del subíndice. El sub- índice es el número de elementos del vector, encerrado entre corchetes. Por ejemplo, long vectorLargo[25]; declara un vector de 25 enteros largos, llamado vectorLargo. Cuando el compilador encuentra esta de- claración reserva la memoria necesaria para los 25 elementos. Puesto que cada entero necesita 4 bytes, esta declaración reserva 100 bytes contiguos de memoria, como se ilustra en la figura 9.1.

Transcript of Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5...

Page 1: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Tema 9. Vectores y Matrices

OBJETIVO

En temas anteriores hemos declarado variables simples de tipo int, float, o de cualquier otro tipo sim-

ple. A menudo necesitaremos declarar una colección de variables, tales como 20 enteros. En este tema veremos cómo podemos declarar arrays vectores y matrices, que reciben el nombre genérico de arrays.

Por otro lado, C no tiene datos predefinidos tipo cadena. En su lugar, C manipula cadenas de caracteres mediante arrays de caracteres que terminan con el carácter nulo ASCII ('\0'). Una cadena se considera

como un vector de tipo char o unsigned char.

Bibliografía

• Joyanes Aguilar, J. “Programación en C++. Algoritmos, estructuras de datos y Objetos”. Capítulos 7 y 9. Ed. McGraw-Hill.

• Pont, M.J. “Software Engineering with C++ and CASE Tools”. Capítulo 7. Pointers and arrays. Ed. Addison-Wesley.

CONTENIDOS

1. ¿Qué es un Array? 1

1.1. Elementos de un Array 2 1.2. Declaración de arrays 3 1.3. Asignación de valores fuera del array 4 1.4. Inicialización de un array 6

2. Matrices (arrays multidimensionales) 6 2.1. Inicialización de arrays multidimensionales 7

3. Cadena de caracteres 9 3.1. Lectura de cadenas 10 3.2. Manejo de cadenas 11

1. ¿Qué es un Array? Un array es una colección de posiciones de almacenamiento de datos, todos ellas con el mismo tipo de dato. Cada posición de almacenamiento se denomina elemento del array. Denominaremos vector a un array unidimensional, y matriz a un array multidimensional.

Para declarar un vector escribimos el tipo de dato, seguido del nombre del vector y del subíndice. El sub-índice es el número de elementos del vector, encerrado entre corchetes. Por ejemplo,

long vectorLargo[25];

declara un vector de 25 enteros largos, llamado vectorLargo. Cuando el compilador encuentra esta de-

claración reserva la memoria necesaria para los 25 elementos. Puesto que cada entero necesita 4 bytes, esta declaración reserva 100 bytes contiguos de memoria, como se ilustra en la figura 9.1.

Page 2: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 2

Figure 9.1. Declaración de un vector.

1.1. Elementos de un vector

Para acceder a los elementos del vector debemos tomar como base el nombre del vector. Los elementos del vector de cuentan a partir de cero, por tanto el primer elemento es NombreVector[0]. En el ejemplo

anterior, VectorLargo[0] es el primer elemento del vector VectorLargo, VectorLargo[1] el segundo y

así sucesivamente.

Esto puede resultar confuso. El vector Vector[3] tiene tres elementos: Vector[0], Vector[1] y

Vector[2]. En general, Vector[n] tiene n elementos, que van desde el Vector[0] hasta el Vector[n-

1]. Por lo tanto, VectorLargo[25] se numera desde VectorLargo[0] hasta VectorLargo[25]. El listado

9.1 muestra cómo declarar un vector de 5 enteros e inicializarlos con un valor.

Programa 9.1: Uso de un vector entero

1: // Listado 9.1: Vectors 2: #include <stdio.h> 3: 4: int main() 5: { 6: int Vector1[5]; 7: int i; 8: for ( i=0; i<5; i++) // 0-4 9: { 10: printf("Valor para Vector1[%d]: ", i); 11: scanf("%d", &Vector1[i]); 12: } 13: for (i = 0; i<5; i++) 14: printf("%d: %d\n", i, Vector1[i]); 15: return 0; 16: }

Salida

Valor para Vector1[0]: 1 Valor para Vector1[1]: 2 Valor para Vector1[2]: 3 Valor para Vector1[3]: 4 Valor para Vector1[4]: 5 0: 1 1: 2

Page 3: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 3

2: 3 3: 4 4: 5

Análisis:

La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras. La línea 8 establece

un bucle que cuenta de 0 a 4, que es el adecuado conjunto de desplazamientos para un vector de cinco elementos. Los sucesivos valores introducidos por el usuario son asignados a los correspondientes ele-mentos del vector. El segundo bucle imprime cada uno de los valores del vector en la pantalla.

NOTA: los vectores cuentan desde 0, no desde 1. Este es el origen de muchos errores en programas C escritos por principiantes. Siempre que utilices un vector, recuerda que un vector con 10 elementos cuenta desde NombreVector[0] hasta NombreVector[9]. NombreVector[10] no se usa.

1.2. Declaración de vectores

Un vector puede tener cualquier nombre que cumpla los requisitos para ser nombre o identificador de una variable, pero no puede tener el mismo nombre que otra variable o vector del mismo ámbito. Por lo tanto, no podemos tener un vector llamado Tabla[5] y una variable llamada Tabla al mismo tiempo.

Podemos dimensionar el tamaño de un vector con una constante o con una enumeración. El listado 9.2 ilustra este hecho.

Programa 9.2: Uso de constantes y enumeraciones en arrays

1: // Listado 9.2 2: // Dimensionado de vectores con constantes y enumeraciones 3: 4: #include <stdio.h> 5: int main() 6: { 7: enum DiasSemana { Lunes, Martes, Miercoles, Jueves, 8: Viernes, Sabado, Domingo, DiasEnSemana }; 9: int ArraySemana[DiasEnSemana] = { 10, 20, 30, 40, 50, 60, 70 }; 10: 11: printf("El valor en viernes es: %d", ArraySemana[Viernes]); 12: return 0; 13: }

Salida

El valor en viernes es: 50

Análisis:

La línea 7 crea una enumeración llamada DiasSemana que tiene ocho miembros. Lunes es igual a cero,

y DiasEnSemana es igual a 7.

Page 4: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 4

La línea 11 usa la constante enumerada viernes como índice del vector. Puesto que viernes vale 4, el quinto elemento del vector, ArraySemana[4] se imprime en pantalla.

1.3. Asignación de valores fuera del vector

Cuando asignamos un valor a un elemento de un vector, el compilador calcula la posición de memoria donde tiene que almacenar dicho valor a partir del subíndice. Supongamos que queremos asignar un va-lor a ArrayLargo[5], que es el sexto elemento del vector. El compilador multiplica el subíndice (5) por el

tamaño del dato (int = 4 bytes). Después se desplaza desde el principio del vector tantos bytes como in-dique el resultado de la multiplicación anterior (20), y escribe el nuevo valor en esa posición. Si tenemos suerte, el programa fallará inmediatamente.

Si queremos asignar un valor a ArrayLargo[50], el compilador ignora el hecho de que dicho elemento no

existe. Solamente calcula el desplazamiento a realizar desde el primer elemento (200 bytes) y escribe el valor en dicha posición. Esta posición puede estar reservada para otra variable, y escribir un valor en di-cha posición puede tener resultados imprevistos. Si no es así, es posible que el programa falle más ade-lante, y será difícil determinar el por qué ha fallado.

El compilador actúa como un ciego que cuenta por pasos la distancia desde una casa. Comienza en la pri-mera casa, PaseoZorrilla[0]. Cuando le pedimos que vaya a la sexta casa del Paseo Zorrilla, él se dice:

“Debo ir cinco casas más allá. Cada casa mide cuatro pasos largos. Por tanto, debo andar 20 pasos”. Si le pedimos que vaya a PaseoZorrilla[100] y el Paseo Zorrilla solo tiene 75 casas, él contará 400 pasos, y

con mucha probabilidad, se pare delante… ¡de un autobús! El listado 9.3 muestra lo que sucede cuando escribimos valores más allá del final del vector.

PRECAUCIÓN: ¡No ejecutes este programa, puede bloquear tu ordenador!

Programa 9.3: Cuidado con el final de un vector

1: /* Listado 7.7 2: Ejemplo de lo que ocurre cuando escribimos mas alla 3: del final de un array */ 4: 5: #include <stdio.h> 6: int main() 7: { 8: short calleUno[3]; 9: short paseoZorrilla[20]; // array a rellenar 10: short calleDos[3]; 11: int i; 12: for (i=0; i<3; i++) 13: { 14: calleUno[i] = -1; calleDos[i] = -2; 15: } 16: 17: for (i=0; i<=25; i++) 18: paseoZorrilla[i] = i; 19: 20: printf("Test 1: \n"); 21: printf("paseoZorrilla[0] : %d \n", paseoZorrilla[0]); 22: printf("paseoZorrilla[20]: %d \n", paseoZorrilla[20]); 23: 24: printf("\nAsignando..."); 25: paseoZorrilla[21] = 21;

Page 5: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 5

26: 27: printf("\nTest 2: \n"); 28: printf("paseoZorrilla[0] : %d\n", paseoZorrilla[0] ); 29: printf("paseoZorrilla[20]: %d\n", paseoZorrilla[20]); 30: printf("paseoZorrilla[21]: %d\n", paseoZorrilla[21]); 31: for (i = 0; i<3; i++) 32: printf("calleUno[%d]: %d\n", i, calleUno[i]); 33: 34: for (i = 0; i<3; i++) 35: printf("calleDos[%d]: %d\n", i, calleDos[i]); 36: 37: return 0; 38: }

Salida del programa

Test 1: paseoZorrilla[0] : 0 paseoZorrilla[20]: 20 Asignando... Test 2: paseoZorrilla[0] : 0 paseoZorrilla[20]: 20 paseoZorrilla[21]: 21 calleUno[0]: 20 calleUno[1]: 21 calleUno[2]: -1 calleDos[0]: -2 calleDos[1]: -2 calleDos[2]: -2

Análisis:

Primero se declaran dos vectores de tres enteros que actúan como centinelas alrededor de paseoZorrilla. Estos vectores centinelas se inicializan con los valores -1 y -2. Si escribimos algo en la

memoria después del final de paseoZorrilla, alguno de los centinelas cambiará probablemente de valor.

Algunos ordenadores asignan memoria de arriba abajo (de direcciones altas a direcciones bajas) mientras que otros lo hacen de abajo hacia arriba (de direcciones bajas a direcciones altas). Por esta razón, hemos colocado centinelas a ambos lados de paseoZorrilla.

Después se asignan valores a los miembros de paseoZorrilla, pero el contador cuenta hasta los subín-

dices 20 y 21, que no existen en paseoZorrilla.

Podemos observar que al imprimir paseoZorrilla[20] se escribe sin ningún problema el valor 20. Sin

embargo, cuando se imprimen calleUno y calleDos, observamos que calleUno[0] ha cambiado. Esto

se debe que la zona de memoria de paseoZorrilla[20] coincide con la zona de memoria de

calleUno[0].

Page 6: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 6

1.4. Inicialización de un vector

Se puede inicializar una vector de tipos estándar, como enteros o caracteres, cuando se declara por pri-mera vez. Después del nombre del vector se coloca el operador de asignación (=), seguido de una lista de

valores separados por comas y encerrados entre llaves. Por ejemplo, la sentencia

int vectorEnteros[5] = { 10, 20, 30, 40, 50 };

declara vectorEnteros como un vector de cinco elementos, y asigna a vectorEnteros[0] el valor 10,

a ArrayEnteros[1] el valor 20, y así sucesivamente.

Si se omite el tamaño del vector, se creará un vector lo suficientemente grande para contener todos los valores listados en la inicialización. Por tanto, la sentencia

int vectorEnteros[] = { 10, 20, 30, 40, 50 };

creará el mismo vector que se creaba en la sentencia previa.

Si necesitamos conocer el tamaño de un vector, podemos decirle al compilador que lo calcule. Por ejem-plo,

unsigned short LongitudVectorEnteros; LongitudVectorEnteros = sizeof(vectorEnteros)/sizeof(vectorEnteros[0]);

asigna a la variable LongitudVectorEnteros el resultado de dividir el tamaño del vector completo por el

tamaño de un elemento del vector. Este cociente es el número de miembros del vector.

No podemos inicializar más elementos de los que hemos declarado para el vector. Por tanto,

int vectorEnteros[5] = { 10, 20, 30, 40, 50, 60};

genera un error porque hemos declarado un vector de cinco miembros y hemos inicializado seis valores. Sin embargo si que es válido escribir

int vectorEnteros[5] = { 10, 20};

Los valores no inicializados son automáticamente inicializados a cero.

2. Matrices (arrays multidimensionales) Es posible manejar arrays de más de una dimensión, denominados en general matrices. Cada dimensión está representada por un subíndice en la matriz. Por tanto, una matriz bidimensional tiene dos subíndi-ces; una matriz tridimensional tiene tres subíndices; y así sucesivamente. Una matriz puede tener cual-quier número de dimensiones, aunque las matrices más utilizadas son las de dos dimensiones.

Un buen ejemplo de matriz es un tablero de ajedrez. Una dimensión representa las ocho filas; la otra di-mensión representa las ocho columnas. La figura 9.2 ilustra esta idea.

Page 7: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 7

Figura 9.2. Un tablero de ajedrez y una matriz.

La declaración de una matriz que represente un tablero de ajedrez podría ser:

int tablero[8][8];

También podríamos representar los mismos datos con una matriz de 64 elementos. Por ejemplo

int tablero[64];

Esto no tiene una correspondencia tan directa con el mundo real como la matriz. Al comienzo de la parti-da el rey está situado en la cuarta posición de la primera fila. En la matriz esta posición corresponde a

tablero[0][3];

suponiendo que el primer subíndice corresponde a la fila y el segundo a la columna. La disposición de las posiciones del tablero completo se muestra en la figura 9.2.

2.1. Inicialización de matrices

Las matrices también se pueden inicializar. La asignación de la lista de valores a los elementos de la ma-triz se realiza manteniendo el primer índice fijo mientras el segundo varía. Por tanto, si tenemos una ma-triz

int matriz1[5][3];

los tres primeros elementos irán a matriz1[0], los tres siguientes a matriz1[1], y así sucesivamente.

La matriz anterior se puede inicializar de la siguiente manera:

int matriz1[5][3] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };

Para mayor claridad, se pueden agrupar los valores entre llaves. Por ejemplo,

int matriz1[5][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}, {13,14,15} };

El compilador ignora las llaves interiores, que hacen más sencillo comprender cómo se distribuyen los va-lores. Cada valor debe separarse con una coma, independientemente de que se utilicen llaves o no. La inicialización completa si que debe encerrarse entre llaves, y debe finalizar con punto y coma.

Page 8: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 8

El listado 9.4 crea una matriz bidimensional. La primera dimensión contiene los números del 0 al 4. La segunda dimensión consta de los valores que duplican los valores de la primera dimensión.

Programa 9.4: Creación de una matriz multidimensional

1: #include <stdio.h> 2: int main() 3: { 4: int i,j; 5: int matriz[5][2] = { {0,0}, {1,2}, {2,4}, {3,6}, {4,8}}; 6: 7: for (i = 0; i<5; i++) 8: { 9: for (j=0; j<2; j++) 10: { 11: printf("matriz[%d][%d] = ", i, j); 12: printf("%d \t", matriz[i][j]); 13: } 14: printf("\n"); 15: } 16: 17: return 0; 18: }

Salida del programa

matriz[0][0] = 0 matriz[0][1] = 0 matriz[1][0] = 1 matriz[1][1] = 2 matriz[2][0] = 2 matriz[2][1] = 4 matriz[3][0] = 3 matriz[3][1] = 6 matriz[4][0] = 4 matriz[4][1] = 8

Análisis:

La línea 5 declara matriz como matriz bidimensional. La primera dimensión consta de cinco enteros; la

segunda dimensión consta de dos enteros. Esto crea una estructura como la de la figura 9.3.

Figura 9.3. Una matriz de 5x2.

Los valores se inicializan por parejas. Las líneas 7 y 8 crean un bucle anidado. El bucle externo recorre los elementos de la primera dimensión. Para cada miembro de esta dimensión, el bucle interno recorre cada uno de los miembros de la segunda dimensión. Esto es consistente con la salida. Al elemento matriz[0][0] le sigue el elemento matriz[0][1]. Una vez que el índice de la segunda dimensión ha re-

corrido todos los elementos de dicha dimensión, el índice de la primera dimensión se incrementa y el ín-dice de la segunda dimensión vuelve a empezar en cero.

Page 9: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 9

3. Cadena de caracteres Una cadena es una serie de caracteres. Las únicas cadenas que hemos visto hasta ahora son las cadenas constantes que utilizamos en las sentencias con printf(), tal como

printf("Hola mundo";

C no tiene datos predefinidos tipo cadena. En su lugar, C manipula cadenas de caracteres mediante vec-tores de de caracteres que terminan con el carácter nulo ASCII ('\0'). Una cadena se considera como un

vector de tipo char o unsigned char.

Podemos declarar e inicializar una cadena del mismo modo que cualquier otro vector. El tipo base, natu-ralmente, es char, o bien, unsigned char. Por ejemplo,

char texto[80]; char Saludo[] = { 'H', 'o', 'l', 'a', , ' ', 'M','u','n','d','o', '\0' };

El último carácter, '\0', es el carácter nulo, que muchas funciones C reconocen como terminador de una

cadena. Aunque este procedimiento de inicializar un vector carácter-a-carácter es correcto, es difícil de escribir y es una fuente potencial de posibles errores. C nos permite usar una forma simplificada de la lí-nea de código anterior. Esto es

char Saludo[] = "Hola Mundo";

Hay dos observaciones importantes sobre esta sintaxis:

• En lugar de caracteres entre comillas simples separados por comas y encerrados entre llaves, se utiliza una cadena de caracteres encerrada entre dobles comillas, sin comas y sin llaves.

• No es necesario añadir el carácter nulo porque el compilador lo hace de forma automática.

La cadena Hola Mundo tiene 11 bytes: Hola tiene 4 bytes, el espacio 1 byte, Mundo 5 bytes, y el carác-

ter nulo 1 byte.

También podemos crear cadenas de caracteres sin inicializar. Al igual que con todos los vectores, es im-portante asegurar que no vamos a utilizar más espacio del reservado. El listado 9.5 muestra el uso de un vector sin valores iniciales.

Programa 9.5. Rellenado de una cadena

1: /* Listado 7.9: rellenado de un vector */ 2: #include <stdio.h> 3: 4: int main() 5: { 6: char buffer[80]; 7: printf("Escriba la cadena: "); 8: scanf("%s", buffer); 9: printf("Este es el buffer: %s\n", buffer); 10: return 0; 11: }

Page 10: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 10

Salida del programa

Escriba la cadena: hola mundo Este es el buffer: hola

Análisis:

En la línea 6 se declara un buffer para 80 caracteres, tamaño suficientemente grande para contener una cadena de 79 caracteres y el carácter nulo para cerrar la cadena.

En la línea 7, se pide al usuario que introduzca una cadena, que se almacena en buffer en la línea 8.

Este programa presenta dos problemas. Primero, si el usuario teclea más de 79 caracteres, scanf() es-

cribirá más allá del final de buffer. Segundo, si el usuario introduce un espacio, scanf() considera que

es el final de la cadena y no escribe más caracteres en buffer. Los caracteres tecleados después del es-

pacio se pierden.

3.1. Lectura de cadenas

Para resolver estos problemas, debemos utilizar alguna de las funciones que veremos a continuación.

Función gets()

La función gets() se utiliza para leer un solo carácter o para leer una cadena de caracteres. El delimita-

dor por defecto es nueva línea. El listado 9.6 ilustra su utilización.

Listado 9.6. Rellenado de una cadena con gets()

1: /* Listado 7.10: rellenado de una cadena */ 2: #include <stdio.h> 3: 4: int main() 5: { 6: char buffer[80]; 7: printf("Escriba la cadena: "); 8: gets(buffer); 9: printf("Este es el buffer: %s\n", buffer); 10: return 0; 11: }

Salida del programa

Escriba la cadena: Hola Mundo Este es el buffer: Hola Mundo

Page 11: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 11

3.2. Manejo de cadenas

Funciones strcpy() y strncpy()

C dispone de una librería de funciones para manejar cadenas: la librería string.h. Entre las muchas fun-ciones disponibles, hay dos para copiar una cadena en otra: strcpy() y strncpy(). strcpy() copia el

contenido completo de una cadena en el buffer indicado. El listado 9.7 muestra el uso de strcpy().

Programa 9.7: Ejemplo de uso de strcpy()

#include <stdio.h> #include <string.h> int main() { char Cadena1[] = "Cadenas de caracteres"; char Cadena2[80]; strcpy(Cadena2, Cadena1); printf("Cadena1: %s\n", Cadena1); printf("Cadena2: %s\n", Cadena2); return 0; }

Salida del programa

Cadena1: Cadenas de caracteres Cadena2: Cadenas de caracteres

Análisis:

En la línea 2 se incluye el archivo de cabecera string.h. Este archivo contiene el prototipo de la función

strcpy(). strcpy() toma dos cadenas de caracteres —una cadena destino seguido de una cadena ori-

gen. Si la cadena origen es más larga que la cadena destino, strcpy() podría escribir fuera del buffer,

más allá del último elemento del mismo.

Vectores

Para declarar un vector, escribe el tipo de variable a almacenar, seguido del nombre del vector y de un índice con el número de elementos que tendrá el vector.

Ejemplo:

int vectorDeEnteros[90];

Para acceder a los miembros de un vector, se utiliza el operador subíndice, [].

Ejemplo:

int ElNovenoEntero = VectorDeEnteros [8];

Los vectores cuentan desde cero. Un vector de n elementos se numera de 0 a n-1.

Page 12: Tema 9. Vectores y Matrices - tel.uva.es · PDF fileVectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras.

Vectores y Matrices 12

Nota del profesor: si detectas algún error, o hay alguna parte confusa, o piensas que sobra o falta alguna sección, por favor, enviadme un mensaje a [email protected]. Gracias por anticipado. Vuestras sugerencias se utilizarán para mejorar estos apun-tes.