Strings (Cadenas de Texto)
Domina la manipulación de strings en C++ para resolver problemas con texto
¿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.
