Saltar a contenido

Textos

Para manejar textos utilizaremos cadenas de caracteres (strings). Un string es un array unidimensional o vector de caracteres terminado en el caracter nulo (null) que es el '\0'.

Declaracion

Para manejar textos declararemos una variable como un vector de tipo char.

1
char saludo[5] = {'H', 'o', 'l', 'a', '\0'};

En el ejemplo anterior vemos como se declara e inicializa un string que contiene la palabra "Hola". Para poder almacenar el caracter nulo de finalización es necesario que el vector tenga el tamaño de los caracteres que deseamos almacenar más uno.

Una forma alternativa de declaración e inicialización de un string equivalente a la anterior es la siguiente:

1
char saludo[] = "Hola";

Utilizamos un valor literal entre comillas para inicializar el string. En ese caso no es necesario colocar el carácter nulo al final, ya lo hace el compilador por nosotros.

Lectura y escritura por consola

Para pedir textos por consola o escribir textos por consola podemos utilizar la funciones printf y scanf utilizando el especificador %s para ser sustituido por los datos de tipo string. Cuando ponemos el vector en el scanf no es necesario poner delante el operador & tal y como hacemos cuando pasamos vectores a funciones en otras ocasiones. Veamos un ejemplo:

Ejemplo:

1
2
3
4
char v[40];
printf("Como te llamas ? ");
scanf(" %s", v);
printf("Hola, %s\n", v);

Resultado:

Como te llamas ? Miguel
Hola, Miguel

En la lectura con scanf es recomendable poner un espacio antes del %s.

Podemos limitar el número de caracteres máximos que se leerán si utilizamos el especificador %s colocando en medio un número. Por ejemplo %4s solamente leerá un máximo de 4 caracteres. Veamos un ejemplo:

Ejemplo:

1
2
3
4
char p[5];
printf("Escribe palabra: ");
scanf(" %4s", p);
printf("Palabra: %s", p);

Ejecución 1:

Escribe palabra: DeepBlue
Palabra: Deep

Ejecución 2:

Escribe palabra: Sea
Palabra: Sea

Scanset

El scanset es un especificador que podemos incluir dentro de un scanf y se representa por %[ ]. Dentro de los corchetes del scanset podemos especificar un caracter, un rango de carácteres como, por ejemplo A-Z, o varios elementos de los anteriores separados por comas. Es necesario tener presente que los caracteres son sensibles a mayúsculas y minúsculas.

Cuando especificamos un scanset, solamente se leerán aquellos caracteres que cumplan con lo especificado en el scanset. Veamos un ejemplo:

Ejemplo:

1
2
3
4
char v[40];
printf("Escribe algo: ");
scanf(" %[A-Z,0-9]s", v);
printf("Escrito: %s\n", v);

Resultado:

Escribe algo: A14BaB41A
Escrito: A14B

En el ejemplo especificamos en el scanset que solamente lea carácteres de la A a la Z (en maýusculas) o bien números. Al proporcionar los caracteres "A14BaB41A" va leyendo hasta encontrar la letra a minúscula. En ese momento se detiene la lectura.

Si en el scanset especificamos en la primera posición entre los corchetes el símbolo '^', el especificador parará la lectura al encontrar la primera ocurrencia del caracter o los caracteres especificados. Veamos un ejemplo:

Ejemplo:

1
2
3
4
5
6
char v1[40], v2[40];
printf("Escribe algo: ");
scanf(" %[^4]s", v1);
scanf(" %s", v2);
printf("Escrito: %s\n", v1);
printf("Escrito: %s\n", v2);

Resultado:

Escribe algo: A14BaB41A
Escrito: A1
Escrito: 4BaB41A

Esto es de mucha utilidad para leer frases completas hasta encontrar un salto de línea o retorno de carro. Para ello podemos utilizar el especificador %[^\n] que ira leyendo todos los caracteres hasta encontrar el caracter nueva línea '\n'.

Veamos un ejemplo de lectura del contenido de un fichero línea a línea. Supongamos que tenemos el fichero con el siguiente contenido:

Contenido del fichero 'texto.txt':

Primera linea
Segunda linea
Tercera linea

Ejemplo:

1
2
3
4
5
6
7
8
char linea[81];
FILE *f;
f = fopen("texto.txt", "r");
while( fscanf(f, " %[^\n]s", linea) > 0 )
{
    printf("%s\n", linea);
}
fclose(f);

Resultado en la consola:

Primera linea
Segunda linea
Tercera linea

Lectura y escritura a un string

Podemos leer y escribir datos directamente sobre un string de la misma forma que podemos leer datos y escribir datos en un fichero de texto. Para ello en lugar de fscanf y fprintf (que utilizamos para ficheros) utilizaremos sscanf y sprintf. Su uso es equivalente salvo que, en lugar del puntero al fichero, especificaremos el vector de caracteres que representa el string. Veamos un ejemplo:

Ejemplo:

1
2
3
4
5
6
7
8
int a, b;
char datos[] = "10 20";
char resultado[41];

sscanf(datos, "%i %i", &a, &b);
sprintf(resultado, "a:%i\nb:%i", a, b);

printf("%s", resultado);

Resultado:

a:10
b:20

En el ejemplo leemos dos valores enteros del texto datos utilizando sscanf y los almacenamos en las variables enteras a y b. Luego escribimos un texto en la variable resultado utilizando sprintf. Por último, mostramos por consola el valor de la variable resultado. Tanto sscanf como sprintf requiren un primer parámetro que es el vector de caracteres del cual leer o escribir, un segundo parámetro que es la cadena de formato con los comodines y, a continuación, tantos parámetros como comodines para sustituir en la escritura o para recoger los valores en la lectura.

Funciones para textos

En la librería string.h existen varias funciones que facilitan el trabajo con textos. Para utilizarlas hemos de incluir la directiva #include <string.h> en nuestro código.

Función strlen

La función strlen calcula la longitud de un string, es decir, cuantos caracteres tiene.

Ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <stdio.h>
#include <string.h>

void main()
{
    int n;
    char p[] = "Hola";
    n = strlen(p);
    printf("Caracteres: %i", n);
}

Resultado:

Caracteres: 4

Función strcpy

La función strcpy copia los caracteres de un string en otro. Pasaremos como primer argumento el string destino y como segundo argumento el string origen. También es posible utilizar la función strncpy en la cual podemos especificar un tercer argumento que es el número de caracteres a copiar.

Ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <stdio.h>
#include <string.h>

void main()
{
    char p[] = "Hola";
    char v[5];
    strcpy(v, p);
    printf("Copia: %s", v);
}

Resultado:

Copia: Hola

Función strcat

La función strcat concatena los caracteres de dos strings. Le añade los caracteres del string que pasamos como segundo argumento al string que pasamos como primer argumento.

Ejemplo:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <string.h>

void main()
{
    char m[] = "Hola";
    strcat(m, " mundo");
    printf("%s", m);
}

Resultado:

Hola mundo

Función strcomp

La función strcmp compara dos strings a y b devolviendo cero si son iguales, un número menor de cero si a < b y un número mayor que cero si a > b.

Ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>

void main()
{
    char p1[21], p2[21];
    printf("Escribe dos palabras: ");
    scanf(" %s %s", p1, p2);
    if (strcmp(p1, p2) == 0)
        printf("Son iguales");
    if (strcmp(p1, p2) < 0)
        printf("%s antes que %s", p1, p2);
    if (strcmp(p1, p2) > 0)
        printf("%s despues de %s", p1, p2);
}

Ejecución 1:

Escribe dos palabras: casa perro
casa antes que perro

Ejecución 2:

Escribe dos palabras: perro casa
perro despues de casa

Ejecución 3:

Escribe dos palabras: casa casa
Son iguales

Función atoi

La función atoi convierte un texto a un tipo de dato entero (int).

Ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
#include <stdlib.h>

void main()
{
    char p1[] = "10";
    char p2[] = "20";
    int n1 = atoi(p1);
    int n2 = atoi(p2);
    printf("%i", n1 + n2);
}

Resultado:

30

Función atof

La función atof convierte un texto a un tipo de dato con decimales (float).

Ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
#include <stdlib.h>

void main()
{
    char p1[] = "10.5";
    char p2[] = "20.4";
    float n1 = atof(p1);
    float n2 = atof(p2);
    printf("%.1f", n1 + n2);
}

Resultado:

30.9