Cargando...

Manejo de cadenas en C++: estilo C y std::string

Aprende manejo de cadenas en C++ usando cadenas estilo C y std::string con ejemplos prácticos.

En C++, las operaciones con texto (strings) pueden realizarse tanto con los arreglos de caracteres de estilo C (char arrays) como con la clase moderna std::string. Los strings de estilo C ofrecen un control de bajo nivel, mientras que la clase std::string es más segura y práctica. En este artículo, exploraremos en detalle todas las formas de trabajar con cadenas de texto en C++.


1. Strings de estilo C (arreglos de char)

Los strings de estilo C son arreglos de char terminados por un carácter nulo ('\0'). Se almacenan en la memoria como una secuencia continua de caracteres.


#include <iostream>
using namespace std;

int main() {
    char mensaje1[] = "Hola";       // '\0' se agrega automáticamente
    char mensaje2[20] = "C++";      // Máximo 19 caracteres + '\0'

    cout << mensaje1 << " " << mensaje2 << endl;
    return 0;
}

Al trabajar con strings de estilo C, es fundamental no exceder los límites del arreglo. C++ no realiza comprobaciones automáticas de límites en este tipo de cadenas.


2. strcpy, strcat, strlen, strcmp (Funciones de strings en C)

Al usar strings de estilo C, se utilizan las funciones de la biblioteca <cstring>:


#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char a[20] = "C++";
    char b[20] = "Programación";

    // Concatenar
    strcat(a, " ");        // a = "C++ "
    strcat(a, b);          // a = "C++ Programación"

    // Copiar
    char c[20];
    strcpy(c, a);

    // Longitud
    cout << "Longitud: " << strlen(a) << endl;

    // Comparar
    if (strcmp(a, c) == 0)
        cout << "A y C son iguales." << endl;

    cout << "Resultado: " << a << endl;
}

Estas funciones deben usarse con precaución, ya que pueden provocar desbordamientos de búfer. En C++ moderno, se recomienda utilizar std::string en su lugar.


3. Introducción a la clase std::string

En el C++ moderno, la biblioteca <string> se utiliza para trabajar con texto. std::string puede crecer dinámicamente, maneja la memoria automáticamente y ofrece una gran variedad de funciones útiles.


#include <iostream>
#include <string>
using namespace std;

int main() {
    string nombre = "Ali";
    string apellido = "Yilmaz";
    string nombreCompleto = nombre + " " + apellido;

    cout << "Hola " << nombreCompleto << endl;
    return 0;
}

El tipo std::string puede concatenarse fácilmente con el operador + y compararse directamente con ==.


4. Operaciones básicas con strings

OperaciónDescripciónEjemplo
ConcatenaciónUne dos cadenasa + b
LongitudDevuelve el número de caracteresa.length() o a.size()
Acceso a caracteresAcceso por índicea[0], a.at(2)
SubcadenaExtrae una parte de la cadenaa.substr(2, 4)
ComparaciónComparación alfabéticaa.compare(b)
¿Vacía?Comprueba si la cadena está vacíaa.empty()
LimpiarElimina el contenidoa.clear()

string texto = "Programación";
cout << texto.length() << endl;   // 12
cout << texto.substr(0, 7) << endl; // "Program"

5. Búsqueda, reemplazo y eliminación

std::string proporciona potentes funciones para la manipulación de texto:


string mensaje = "Lenguaje de programación C++";

// Buscar
size_t posicion = mensaje.find("programación");
if (posicion != string::npos)
    cout << "'programación' encontrada en el índice: " << posicion << endl;

// Reemplazar
mensaje.replace(4, 11, "moderno"); // reemplaza 11 caracteres desde el índice 4
cout << mensaje << endl; // "Lenguaje moderno C++"

// Eliminar
mensaje.erase(4, 7); // elimina 7 caracteres desde el índice 4
cout << mensaje << endl; // "Lenguaje C++"

El método find() devuelve string::npos si no se encuentra el texto buscado. Este valor significa “no encontrado”.


6. Operaciones a nivel de caracteres

Dado que una cadena está compuesta por caracteres, puede procesarse carácter por carácter utilizando bucles.


#include <iostream>
#include <string>
using namespace std;

int main() {
    string palabra = "Cplusplus";

    for (char c : palabra) {
        cout << c << " ";
    }

    cout << endl;

    // Convertir a mayúsculas
    for (char &c : palabra) {
        c = toupper(c);
    }
    cout << palabra << endl;
}

Para las conversiones de caracteres, se pueden usar las funciones toupper() y tolower() de la biblioteca <cctype>.


7. Operaciones de conversión (string <→ int, double)

Una std::string puede convertirse en valores numéricos y viceversa.


#include <iostream>
#include <string>
using namespace std;

int main() {
    string textoNumero = "42";
    int numero = stoi(textoNumero); // string → int
    double d = stod("3.14");        // string → double

    cout << numero + 10 << endl; // 52
    cout << d * 2 << endl;       // 6.28

    // int → string
    int edad = 25;
    string texto = to_string(edad);
    cout << "Edad: " << texto << endl;
}

8. Comparación (compare, ==, <, >)

Las cadenas pueden compararse usando el método compare() o los operadores de comparación.


string a = "Ali";
string b = "Veli";

if (a == b)
    cout << "Iguales" << endl;
else if (a < b)
    cout << "A viene antes alfabéticamente" << endl;
else
    cout << "A viene después alfabéticamente" << endl;

9. Operaciones de entrada y salida

El objeto cin solo lee hasta el primer espacio. Si deseas leer una oración completa, debes usar la función getline().


#include <iostream>
#include <string>
using namespace std;

int main() {
    string nombre;
    cout << "Ingrese su nombre: ";
    cin >> nombre;
    cout << "Hola, " << nombre << endl;

    cin.ignore(); // limpia el carácter de nueva línea que queda en el búfer

    string frase;
    cout << "Ingrese una frase: ";
    getline(cin, frase);

    cout << "Frase ingresada: " << frase << endl;
}

getline() lee toda la línea, incluidos los espacios.


10. Ejemplo práctico: Análisis de texto

En el siguiente ejemplo, se cuenta el número de palabras y caracteres en una oración ingresada por el usuario.


#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main() {
    string texto;
    cout << "Ingrese una oración: ";
    getline(cin, texto);

    int cantidadCaracteres = 0;
    int cantidadPalabras = 1;

    for (char c : texto) {
        if (isalpha(c))
            cantidadCaracteres++;
        if (c == ' ')
            cantidadPalabras++;
    }

    cout << "Cantidad de caracteres: " << cantidadCaracteres << endl;
    cout << "Cantidad de palabras: " << cantidadPalabras << endl;
    return 0;
}

11. TL;DR

  • Las cadenas de estilo C son arreglos char[] y deben manejarse con cuidado.
  • En C++ moderno se recomienda usar la clase std::string.
  • Operaciones básicas: +, length(), substr(), find(), replace(), erase().
  • Para conversiones numéricas, usa stoi(), stod() y to_string().
  • getline() permite leer texto que contiene espacios.
  • Todos los ejemplos pueden ejecutarse en Visual Studio 2022 o GCC 11+.

Artículos relacionados