Cadenas de Caracteres.

Operaciones con cadenas:

Entrada/salida de cadenas.

Las cadenas se muestran con printf y la adecuada marca de formato sin que se presenten dificultades especiales. Lo que sí resulta problemático es leer cadenas. La función scanf presenta una seria limitación: solo puede leer ((palabras)), no ((frases)). Ello nos obliga a presentar una nueva función (gets).

Salida con printf:

Empecemos por considerar la función printf, que muestra cadenas con la marca de formato %s. Aquí se tiene un ejemplo de uso:

    #include <stdio.h>
    #define MAXLON 80 
    int main()
    {
        char cadena[MAXLON+1] = "una cadena";

        printf ("El valor de cadena es %s.\n", cadena); 
    return 0; 
    }
            

El resultado es el siguiente:

printf01


Se puede alterar la presentación de la cadena con modificadores:

    #include <stdio.h> 
    #define MAXLON 80
    int main() {
        char cadena[MAXLON+1] = "una cadena";

        printf("El valor de cadena es (%s).\n", cadena);
        printf("El valor de cadena es (%20s).\n", cadena);
        printf("El valor de cadena es (%-20s).\n", cadena);
    return 0;
    }          
            

Teniendo como resultado:

printf02


Si se desea mostrar una cadena carácter a carácter, se Puede hacer llamando a printf sobre cada uno de los caracteres, pero debe recordar que la marca de formato asociada a un carácter es %c:

    #include <stdio.h>
    #define MAXLON 80
    int main(void) {
        char cadena[MAXLON+1] = "una cadena";

        int i; 
        i = 0;
        while (cadena[i] != ’\0’) {
            printf ("%c\n", cadena[i]);
            i++;
        }
    return 0;
    }
    		

Este es el resultado de la ejecución:

printf03


Entrada con scanf:

La función scanf es un reto mayor. He aquí un ejemplo que pretende leer e imprimir una cadena en la que podemos guardar hasta 80 caracteres (sin contar el terminador nulo):

    #include <stdio.h>
    #define MAXLON 80
    int main(void) {
        char cadena[MAXLON+1];

        printf ("Introduce una cadena: ");    
        scanf ("%s", cadena); 
        printf ("La cadena leída es %s\n", cadena); 
    return 0;
    }
            

Debe notar que con las cadenas no hay que poner el caracter & del identificador al usar scanf. Recordar: cadena[0] es un char, pero cadena, sin mas, es la dirección de memoria en la que empieza el vector de caracteres. Al ejecutar el programa introduciendo la cadena "una" se obtiene el siguiente resultado por pantalla.

scanf01


Hay un problema práctico con scanf: solo lee una (palabra), es decir, una secuencia de caracteres no blancos. Si al ejecutar el programa tecleamos un par de palabras (una prueba), sólo se muestra la primera. Por pantalla se obtendría lo siguiente:

scanf02


Entrada con gets:

La función gets lee todos los caracteres que hay hasta encontrar un salto de línea. Dichos caracteres, excepto el salto de línea, se almacenan a partir de la dirección de memoria que se indique como argumento y se añade un terminador.

    #include <stdio.h> 
    #define MAXLON 11 
    int main(void) 
    {
        char a[MAXLON+1], b[MAXLON+1];
    
        printf ("Introduce una cadena: "); gets(a);
        printf ("Introduce otra cadena: "); gets(b);
        printf ("La primera es %s y la segunda es %s\n", a, b);
    return 0;
    }
    
            

Este es el resultado de la ejecución:

gets01


Entrada con sscanf:

La función sscanf es similar a scanf (se diferencia en la ((s)) inicial), pero no obtiene información leyéndola del teclado, sino que la extrae de una cadena. Un ejemplo para entender el procedimiento:

    #include <stdio.h>
    #define MAXLINEA 80
    #define MAXFRASE 40
    int main()
    {
        int a, b;
        char frase[MAXFRASE+1];
        char linea[MAXLINEA+1];

        printf ("Dame el valor de un entero:");
        gets(linea); sscanf (linea, "%d", &a);
        printf ("Introduce ahora una frase:");
        gets(frase);
        printf ("Y ahora, dame el valor de otro entero:");
        gets(linea); sscanf (linea, "%d", &b);
        printf ("Enteros leídos: %d, %d.\n", a, b);
        printf ("Frase leída: %s.\n", frase);
    return 0; 
    }
            

En el programa se ha definido una variable auxiliar, linea, que es una cadena con capacidad para 80 caracteres mas el terminador (puede resultar conveniente reservar mas memoria para ella en según que aplicación). Cada vez que deseamos leer un valor escalar, leemos en línea un texto que introduce el usuario y obtenemos el valor escalar (numérico) con la función sscanf. Dicha función recibe, como primer argumento, la cadena en línea; como segundo, una cadena con marcas de formato; y como tercer parámetro, la dirección de la variable escalar en la que queremos depositar el resultado de la lectura.

Este es el resultado:

sscanf01


Escritura en cadenas sprintf:

Hay una función que puede simplificar notablemente la creación de cadenas cuyo contenido se debe calcular a partir de uno o mas valores: sprintf , disponible incluyendo la cabecera stdio.h (se trata, en cierto modo, de la operación complementaria de sscanf ). La función sprintf se comporta como printf , salvo por un ((detalle)): no escribe texto en pantalla, sino que lo almacena en una cadena.

Ejemplo:

    #include <stdio.h>
    #define MAXLON 80
    int main(void)
    {
        char a[MAXLON+1] = "una";
        char b[MAXLON+1] = "cadena";
        char c[MAXLON+1];
      
        sprintf (c, "%s %s", a, b);
        printf ("%s\n", c); 
    return 0;
    }
            

Si se ejecuta el programa mostrara por pantalla…

sprintf01

Asignación y copia de cadenas:

Para efectuar una copia de una cadena, has de hacerlo carácter a carácter, o en su defecto usar las función strcpy correspondiente incluidas en <string.h>

    #include <string.h>            
    #define MAXLON 10 ***
    int main() 
    {
        char original[MAXLON+1] = "cadena";
        char copia[MAXLON+1];
        int i;

        for (i = 0; i <= MAXLON; i++)
            copia[i] = original[i]; 
    return 0;
    }
            

Se Debe notar que el bucle recorre los 10 caracteres que realmente hay en original pero, de hecho, solo se requieren copiar los caracteres que hay hasta el terminador, incluyéndole a él.

    #define MAXLON 10
    int main() 
    {
        char original[MAXLON+1] = "cadena";
        char copia[MAXLON+1]; 
        int i;

        for (i = 0; i <= MAXLON; i++) {
            copia[i] = original[i];
            if (copia[i] == ’\0’)
        break;
        }
    return 0;
    }
            

Este sería el resultado:

asig-cop-cadena

Longitud de una cadena:

El convenio de terminar una cadena con el carácter nulo permite conocer fácilmente la longitud de una cadena:

    #include <stdio.h>
    #define MAXLON 80
    int main(void)
    {
        char a[MAXLON+1];
        int i;
    
        printf ("Introduce una cadena (max. %d cars.): ", MAXLON);
        gets(a);
        i = 0;
        while (a[i] != ’\0’) i++;
            printf ("Longitud de la cadena: %d\n", i);
    return 0;
    }
            

Calcular la longitud de una cadena es una operación frecuentemente utilizada, así que está predefinida en la biblioteca de tratamiento de cadenas <string.h> (strlen). Acá un ejemplo de conteo de caracteres usando strlen (conteo de vocales minúsculas) leída la cadena desde teclado.

    #include <stdio.h>
    #include <string.h>
    #define MAXLON 80
    int main()
    {
        char a[MAXLON+1];
        int i, contador=0, longitud;
    
        printf ("Introduce una cadena (max. %d cars.): ",MAXLON); gets(a);
        longitude = strlen(a);
        for (i = 0; i < longitud; i++) 
            if (a[i] == ’a’ || a[i] == ’e’ || a[i] == ’i’ || a[i] == ’o’ || 
                a[i] == ’u’)
                contador++;
        printf ("Vocales minúsculas: %d\n", contador);
    return 0;
    }
            

Concatenación:

En C existe la posibilidad de concatenar cadenas con bucles. Este programa, por ejemplo, pide dos cadenas y concatena la segunda a la primera:

    #include <stdio.h>
    #define MAXLON 80
    int main(void)
    {
        char a[MAXLON+1], b[MAXLON+1];
        int longa, longb;
        int i;
            
        printf ("Introduce un texto (max. %d cars.): ", MAXLON);
        gets(a); 
        printf ("Introduce otro texto (max. %d cars.): ", MAXLON);
        gets(b);
        longa = strlen(a);
        longb = strlen(b);
        for (i=0; i<longb; i++)
        a[longa+i] = b[i];
        a[longa+longb] = ’\0’;
        printf ("Concatenación de ambos: %s", a);
    return 0;
    }
            

Escribamos como ejemplo "casa grande" y veamos lo que pasa:

contatenacion01


Seguir a paginadeC en Twitter Foro de Página de C ¡CSS Válido!