Fundamentos de C/C++

Las cadenas en C y en C++

En esta lección vas a comparar los arreglos de caracteres de C y std::string de C++ para obtener la longitud, concatenar, comparar y buscar en una cadena.

Introducción

C guarda el texto en arreglos de char que terminan con un carácter invisible, '\0', y es el programador quien debe garantizar que el arreglo tenga espacio suficiente. C++ ofrece std::string, un tipo de cadena que gestiona su propia memoria y hace que trabajar con texto sea mucho más seguro y cómodo.

Puntos importantes

  • Activa los avisos del compilador (compiler warnings) y corrígelos todos.
  • Entiende bien el tipo y la vida útil (lifetime) de cada valor.
  • Comprueba siempre los datos de entrada y los límites de los índices de los arreglos.

Ejemplos de código C y C++

C
Ejecutar →
main.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void) {
    /* A C string is a char array that ends with '\0'. */
    char name[32] = "Ada";
    printf("%s has %zu letters\n", name, strlen(name));

    /* strcat appends; the array must have room for the result. */
    strcat(name, " Lovelace");
    printf("%s\n", name);

    /* strcmp returns 0 when two strings are equal. */
    printf("equal: %d\n", strcmp("cat", "cat") == 0);

    /* Walk the characters until the terminating '\0'. */
    char upper[32];
    size_t i = 0;
    for (; name[i] != '\0'; i++) {
        upper[i] = (char)toupper((unsigned char)name[i]);
    }
    upper[i] = '\0';
    printf("%s\n", upper);

    /* strstr finds a substring and returns a pointer to it, or NULL. */
    printf("contains \"love\": %s\n", strstr("lovelace", "love") ? "yes" : "no");
    return 0;
}
Resultado de la ejecución
Ada has 3 letters
Ada Lovelace
equal: 1
ADA LOVELACE
contains "love": yes
C++
Ejecutar →
main.cpp
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>

int main() {
    // std::string manages its own memory and grows as needed.
    std::string name = "Ada";
    std::cout << name << " has " << name.size() << " letters\n";

    name += " Lovelace";
    std::cout << name << '\n';

    // == compares the contents of two strings.
    std::cout << "equal: " << (std::string("cat") == "cat") << '\n';

    std::string upper = name;
    std::transform(upper.begin(), upper.end(), upper.begin(),
                   [](unsigned char c) { return static_cast<char>(std::toupper(c)); });
    std::cout << upper << '\n';

    // find returns std::string::npos when the text is missing.
    std::string word = "lovelace";
    std::cout << "contains \"love\": " << (word.find("love") != std::string::npos ? "yes" : "no") << '\n';
    std::cout << "first name: " << name.substr(0, 3) << '\n';
}
Resultado de la ejecución
Ada has 3 letters
Ada Lovelace
equal: 1
ADA LOVELACE
contains "love": yes
first name: Ada

Comparación entre C y C++

En C, las funciones strlen, strcat, strcmp y strstr trabajan directamente sobre los arreglos de caracteres, y si el arreglo no es lo bastante grande al concatenar, el programa puede sufrir un desbordamiento de búfer (buffer overflow). std::string ofrece size(), +=, ==, find() y substr() y amplía su memoria por sí mismo cuando hace falta, lo que evita ese problema.

C

C usa funciones procedurales pequeñas y muestra abiertamente cómo se representan los datos en memoria.

C++

C++ sigue permitiendo trabajar a bajo nivel, pero añade tipos de biblioteca y abstracciones más seguras.

Ejercicios de práctica

Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.

  • Prueba entradas no válidas y valores límite.
  • Compila con las opciones -Wall -Wextra -Wpedantic para activar más avisos.
  • Pon las declaraciones comunes en un archivo de cabecera y la implementación en un archivo aparte.

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos