ARRAYS y cadenas

Un array es una colección de elementos del mismo tipo, colocados de forma consecutiva en memoria.
El primer elemento siempre es el elemento 0.

Definición:

tipo nombre[tamaño];

Un array de enteros de 10 elementos llamado valores lo declararíamos así:


referenciríamos cada elemento a través de su índice de posición.

valores[7] = 2638; /* Asignación del valor 2638 a la posición 7 */



Se pueden inicializar los valores uno por uno:
valores[0] = 77;
valores[1] = 53;
valores[2] = 98;
valores[3] = 5001;
valores[4] = 497;
valores[5] = 253;
valores[6] = 736; 
valores[7] = 2638;
valores[8] = 4723;
valores[9] = 54;

valores[0] contendría el valor 77
valores[1] contendría el valor 53
. . .
valores[9] contendría el valor 54

O en el momento de la declaración:
int valores[]={77, 53, 98, 5001, 497, 253, 736, 2638, 4723, 54};

Como se puede observar no hemos puesto el tamaño del array. No es necesario ya que al poner una lista con los valores, el propio compilador los cuenta y reserva la memoria necesaria para guardarlo al completo.

Trataremos cualquiera de estos elementos como si de un entero normal se tratara, de echo son enteros. Para imprimir en pantalla cualquiera de sus valores lo haríamos igual que si de un valor entero se tratase:

     printf("\nvalores[5] = %d\n",valores[5]);

Mostraría en pantalla
     valores[5] = 253

Podemos operar con ellos normalmente. Lo importante es no superar el índice del array, o nos dará error. Normalmente el compilador se da cuenta de acceso a un índice fuera de rango y nos lo hace saber en tiempo de compilación.

El programa ha intentado acceder  al elemento 10 produciendo un error de compilación

warning: array index 10 in past the end of the array



C no tiene un tipo de dato cadena. Para operar con cadenas utilizaremos un array de caracteres cuyo último elemento será un carácter nulo ('\0'). Por lo que nuestro array medirá el tamaño de la cadena a contener + el carácter nulo.






#include<stdio.h>

int main(void)
{
char cadena[11] = "Hola mundo";

printf("\n%s\n",cadena);

return 0;
}


Este programa muestra en la ventana del terminal la frase Hola mundo

También podríamos haber inicializado el array elemento a elemento de esta manera:

char cadena[11];
cadena[0] = 'H';
cadena[1] = 'o';
cadena[2] = 'l';
cadena[3] = 'a';
cadena[4] = ' ';
cadena[5] = 'M';
cadena[6] = 'u';
cadena[7] = 'n';
cadena[8] = 'd';
cadena[9] = 'o';
cadena[10] ='\0';

El resultado hubiera sido el mismo.

La biblioteca de C nos provee de una serie de funciones para operar con cadenas. Para poder hacer uso de ellas debemos incluir en la cabecera de nuestro programa el archivo strings.h mediante la directiva del preprocesador include.

#include<strings.h>

Por ejemplo si quisiéramos copiar una cadena en otra:


#include <stdio.h>

int main (void)
{
char cadena[11];
char otraCad[11];
cadena[0] = 'H';
cadena[1] = 'o';
cadena[2] = 'l';
cadena[3] = 'a';
cadena[4] = ' ';
cadena[5] = 'M';
cadena[6] = 'u';
cadena[7] = 'n';
cadena[8] = 'd';
cadena[9] = 'o';
cadena[10] ='\0';

otraCad = cadena;
printf("%s\n", otraCad);
return 0;
}

Daría error de compilación.

error: array type 'char [11]' is not assignable.

Aquí es donde entran en juego las funciones de la biblioteca estándar
Para asignar una cadena a otra usaremos la función strcpy(char *_fuente, char *_destino);


#include<stdio.h>

int main(void)
{
char *cadena1 = "Hola";
    char *cadena2  = "Mundo";
char saludo[11];

    strcpy(cadena1, saludo);
    strcat(saludo, " ");
    strcat(saludo, cadena2);
printf("\n%s\n", saludo);

return 0;
}


Produciría la salida:
Hola Mundo
strcat(char *_destino, char *_fuente); añade una cadena_fuente a la cadena_destino.


En el apartado estructuras, hemos declarado una estructura struct alumno. Vamos a utilizar esta estructura para crear un programa un poco mas complejo. La función fill_reg(..) rellena cada elemento struct que recibe con el resto de parámetros que se le pasa a la función. Una sola estructura es poco operativo, pero si creamos un array que contenga 10 elementos, por ejemplo, podría servir para contener los datos de alumnos de una clase concreta.


En la línea 5 comienza la declaración de la estructura alumno, que ya habíamos visto antes. En las líneas 14 y 15 vemos las declaraciones de las funciones fill_reg() y view_regs() que se definen tras la función main().

En la línea 19 tenemos la declaración del array reg_alumn de 10 elementos tipo struct alumno. Recordemos que el primer elemento de un array es el elemento 0.

En la línea 32 comienza la definición de la función fill_reg() en la que podemos ver como para acceder a cada elemento de la estructura se utiliza el operador flecha ->, esto es por que lo que recibe la función como primer parámetro no es una estructura, si no un puntero a un elemento estructura, lo que se define como paso por referencia.

En la línea 41 comienza la definición de la función view_regs(). Esta función recibe un array de estructuras tipo alumno y un número entero que representa la cantidad real de registros completos.


Las librerías de C nos proveen de un gran numero de funciones para el manejo de cadenas. Todas ellas accesibles incluyendo strings.h mediante la directiva del preprocesador
#include <strings.h>
en la cabecera de nuestro archivo, como vemos en los ejemplos.

Otras funciones:

  • strcpy( cad_destino, cad_fuente) copia cad_fuente en cad_destino.
  • strlen(cad) devuelve la longitud de la cadena
  • strcat(cad_destino, cad_otra) concatena en cad_destino, cad_destino y cad_otra
  • strcmp(cad1, cad2)  
    • Devuelve:
      • si cad1 = cad2 devuelve 0
      • si cad1 > cad2 devuelve un valor inferior a 0
      • si cad < cad 2 devuelve un valor superior a 0