Estructuras de Datosc++stringscadenastexto

Strings (Cadenas de Texto)

Domina la manipulación de strings en C++ para resolver problemas con texto

OOI Oaxaca9 de febrero de 20266 min read

¿Qué es un string?

Un string es una secuencia de caracteres: letras, números, espacios, símbolos. Piensa en él como un collar de cuentas donde cada cuenta es un carácter.

String "Hola":
┌─────┬─────┬─────┬─────┐
│ 'H' │ 'o' │ 'l' │ 'a' │
├─────┼─────┼─────┼─────┤
│ [0] │ [1] │ [2] │ [3] │  ← Índices
└─────┴─────┴─────┴─────┘

Un string es básicamente un vector de caracteres con funciones especiales para texto.

Crear y usar strings

#include <string>
using namespace std;

string saludo = "Hola mundo";
string vacio = "";
string letra = "A";      // String de un carácter (diferente de char 'A')
string repetido(5, 'x');  // "xxxxx" (5 veces el carácter 'x')

Operaciones básicas

string s = "Hola";

// Longitud
cout << s.size() << endl;     // 4
cout << s.length() << endl;   // 4 (equivalente a size())

// Acceder por índice
cout << s[0] << endl;  // 'H'
cout << s[3] << endl;  // 'a'

// Modificar un carácter
s[0] = 'h';
cout << s << endl;  // "hola"

// ¿Está vacío?
cout << s.empty() << endl;  // 0 (false)

// Último carácter
cout << s.back() << endl;   // 'a'

Concatenar (unir)

string a = "Hola";
string b = " mundo";

string c = a + b;           // "Hola mundo"
cout << c << endl;

a += "!!!";                  // a = "Hola!!!"
a += ' ';                    // También puedes agregar un char

Comparar strings

Los strings se comparan lexicográficamente (orden de diccionario):

string a = "abc", b = "abd";
cout << (a < b) << endl;   // 1 (true)
cout << (a == b) << endl;  // 0 (false)
cout << (a != b) << endl;  // 1 (true)

// "abc" < "abd" porque 'c' < 'd'
// "abc" < "abcd" porque "abc" es prefijo y es más corto

Recorrer un string

string s = "Hola";

// Forma 1: con índice
for (int i = 0; i < s.size(); i++) {
    cout << s[i] << " ";
}
// H o l a

// Forma 2: for-each
for (char c : s) {
    cout << c << " ";
}
// H o l a

// Forma 3: for-each por referencia (para modificar)
for (char &c : s) {
    c = toupper(c);
}
cout << s << endl;  // HOLA

Leer strings

string palabra;
cin >> palabra;       // Lee UNA palabra (hasta el espacio)

string linea;
getline(cin, linea);  // Lee una LÍNEA completa (incluyendo espacios)

Recuerda: Si usas cin >> antes de getline, agrega cin.ignore():

int n;
cin >> n;
cin.ignore();        // Limpia el '\n' del buffer

string linea;
getline(cin, linea);  // Ahora funciona correctamente

Funciones útiles de string

Substrings (subcadenas)

string s = "Hola mundo";

string sub = s.substr(5);       // "mundo" (desde posición 5 hasta el final)
string sub2 = s.substr(0, 4);   // "Hola" (desde posición 0, longitud 4)
string sub3 = s.substr(5, 3);   // "mun" (desde posición 5, longitud 3)

Buscar dentro del string

string s = "Hola mundo cruel";

size_t pos = s.find("mundo");     // 5 (posición donde empieza "mundo")
size_t pos2 = s.find("xyz");      // string::npos (no encontrado)

if (s.find("mundo") != string::npos) {
    cout << "Encontrado" << endl;
}

// Buscar un carácter
size_t pos3 = s.find('o');        // 1 (primera 'o')
size_t pos4 = s.rfind('o');       // 12 (última 'o')

Insertar y borrar

string s = "Hola mundo";

s.insert(5, "bello ");      // "Hola bello mundo"
s.erase(5, 6);               // "Hola mundo" (borrar 6 chars desde posición 5)

Reemplazar

string s = "Hola mundo";
s.replace(5, 5, "amigo");   // "Hola amigo" (reemplazar 5 chars desde pos 5)

Convertir entre tipos

// Número → String
int n = 42;
string s = to_string(n);    // "42"

double d = 3.14;
string s2 = to_string(d);   // "3.140000"

// String → Número
string numStr = "12345";
int num = stoi(numStr);      // 12345 (string to int)
long long big = stoll(numStr); // 12345 (string to long long)
double dec = stod("3.14");   // 3.14 (string to double)

Patrones comunes con strings en competencias

Invertir un string

string s = "abcde";
reverse(s.begin(), s.end());
cout << s << endl;  // "edcba"

Verificar palíndromo

bool esPalindromo(string s) {
    int n = s.size();
    for (int i = 0; i < n / 2; i++) {
        if (s[i] != s[n - 1 - i]) return false;
    }
    return true;
}

// O más corto:
bool esPalindromo2(string s) {
    string rev = s;
    reverse(rev.begin(), rev.end());
    return s == rev;
}

Contar frecuencia de caracteres

string s;
cin >> s;

int freq[256] = {0};
for (char c : s) {
    freq[c]++;
}

// Mostrar frecuencias
for (char c = 'a'; c <= 'z'; c++) {
    if (freq[c] > 0) {
        cout << c << ": " << freq[c] << endl;
    }
}

Verificar si dos strings son anagramas

Dos strings son anagramas si tienen las mismas letras en diferente orden (ej: "amor" y "roma"):

bool sonAnagramas(string a, string b) {
    sort(a.begin(), a.end());
    sort(b.begin(), b.end());
    return a == b;
}

Separar palabras de una línea

string linea;
getline(cin, linea);

// Método con stringstream
stringstream ss(linea);
string palabra;
vector<string> palabras;

while (ss >> palabra) {
    palabras.push_back(palabra);
}

Convertir todo a minúsculas/mayúsculas

string s = "Hola Mundo";

// A minúsculas
for (char &c : s) {
    c = tolower(c);
}
cout << s << endl;  // "hola mundo"

// A mayúsculas
for (char &c : s) {
    c = toupper(c);
}
cout << s << endl;  // "HOLA MUNDO"

String como arreglo de chars

Recuerda que un string es internamente un arreglo de char. Todo lo que aprendiste sobre char y ASCII aplica aquí:

string s = "abc123";

for (char c : s) {
    if (c >= '0' && c <= '9') {
        int digito = c - '0';
        cout << "Dígito: " << digito << endl;
    } else if (c >= 'a' && c <= 'z') {
        int posicion = c - 'a' + 1;
        cout << "Letra en posición: " << posicion << endl;
    }
}

Ejercicio de práctica

Lee una cadena y cuenta cuántas palabras tiene (las palabras están separadas por espacios).

Entrada: Hola mundo cruel Salida: 3

Ver solución
#include <iostream>
#include <sstream>
using namespace std;

int main() {
    string linea;
    getline(cin, linea);

    stringstream ss(linea);
    string palabra;
    int cuenta = 0;

    while (ss >> palabra) {
        cuenta++;
    }

    cout << cuenta << endl;

    return 0;
}

Siguiente paso

Aprende sobre Matrices para trabajar con datos en dos dimensiones.