DMarlon Studio

Lección 11 · 11 de 20

Cadenas de caracteres · C

Trabaje con textos en C como arrays de char terminados en '\0', con las funciones de string.h: strlen, strcpy, strcat y strcmp.

C · Cadenas de caracteres en DMarlon Studio: el código del ejemplo y su salida en la terminal

En C, un texto o cadena es un array de char que termina con el carácter especial `'\0'`. char city[20] = "Madrid" ocupa 20 bytes, pero solo usa 7: las seis letras y el '\0'. `strlen` cuenta las letras hasta el '\0' (6), mientras que sizeof da el tamaño del array (20). Como cualquier array, cada letra se lee con su índice: city[0].

Un array no se puede copiar con =. Para eso está `strcpy(destino, origen)`, de string.h. La copia es independiente: cambiar copy[0] a 'm' no toca city. `strcat` añade un texto al final de otro. En ambos casos, el destino debe tener sitio suficiente; si no, se escribiría fuera del array.

Tampoco se comparan con ==. `strcmp(a, b)` devuelve 0 si son iguales, un número negativo si a va antes en orden alfabético y uno positivo si va después. Como "pear" va después de "apple", gana el último else.

Para recorrer una cadena basta con avanzar hasta encontrar el '\0': el for del final lo hace y cuenta las o de greeting.

Código · main.c

#include <stdio.h>#include <string.h>int main(void) {    // A string is a char array that ends with the character '\0'.    char city[20] = "Madrid";    printf("%s has %zu letters\n", city, strlen(city));    printf("The array has room for %zu chars\n", sizeof(city));    printf("First: %c, last: %c\n", city[0], city[strlen(city) - 1]);    // = cannot copy an array: strcpy copies the text.    char copy[20];    strcpy(copy, city);    copy[0] = 'm';    printf("Original: %s, copy: %s\n", city, copy);    // strcat adds text at the end (there must be room for it).    char greeting[40] = "Hello from ";    strcat(greeting, city);    printf("%s\n", greeting);    // strcmp gives 0 if equal, <0 or >0 for alphabetical order.    char a[] = "pear", b[] = "apple";    if (strcmp(a, b) == 0) printf("Same fruit\n");    else if (strcmp(a, b) < 0) printf("%s comes before %s\n", a, b);    else printf("%s comes before %s\n", b, a);    // Walk the string until '\0', counting the letter 'o'.    int found = 0;    for (int i = 0; greeting[i] != '\0'; i++)        if (greeting[i] == 'o') found++;    printf("'%s' has the letter o %d times\n", greeting, found);    return 0;}

Salida · cc main.c -o main && ./main

Madrid has 6 letters
The array has room for 20 chars
First: M, last: d
Original: Madrid, copy: madrid
Hello from Madrid
apple comes before pear
'Hello from Madrid' has the letter o 2 times

Para recordar

  • Una cadena es un array de char que acaba en '\0'.
  • strlen cuenta letras; sizeof mide el array.
  • strcpy copia y strcat añade: el destino necesita sitio.
  • strcmp da 0 si los textos son iguales.
  • Los textos no se copian con = ni se comparan con ==.

Ejercicio

Recorra greeting y convierta cada letra minúscula en mayúscula restándole 'a' - 'A'; después escríbalo (debe salir HELLO FROM MADRID).