Texto / C++17

Strings

Llevar al apunte ↗

Descripción

Un string guarda una secuencia de caracteres char. Sus posiciones empiezan en cero. En "CASA", s[0] es 'C' y s[3] es 'A'.

Las comillas simples representan un carácter, como 'A'. Las dobles representan texto, como "CASA". Al copiar un string, podés modificar la copia sin cambiar el original.

Usalo para palabras, líneas, códigos y datos que necesitás examinar o modificar como texto. También permite conservar los dígitos de un número muy grande o los ceros iniciales de un identificador. En las entradas habituales de letras y dígitos, podés recorrerlo carácter por carácter, buscar un fragmento o construir una respuesta agregando texto.

Un string conserva el orden y las repeticiones. En "CASA" importan las dos apariciones de 'A' y sus posiciones. Si querés guardar varias palabras, un vector<string> conserva esa lista. Un set<string> guarda las palabras distintas y las ordena, mientras un map<string, int> permite asociar un contador a cada palabra.

size() cuenta elementos char. Un carácter acentuado o un emoji codificado en UTF-8 puede ocupar varios. Los ejemplos de índices y alfabetos de esta ficha usan letras y dígitos de un solo byte, como los garantizados por muchos enunciados.

Funciones y operaciones

En la tabla, s es un string, t es otro texto, c es un carácter y n es una cantidad. pos y desde son índices. cant indica cuántos caracteres usar.

Uso Parámetros Resultado o efecto Modifica s
string s; Ninguno Crea un string vacío Lo crea
string s(n, c); Cantidad y carácter Crea n copias de c Lo crea
cin >> s String donde guardar Lee una palabra, separada por espacios o saltos de línea Sí
getline(cin, s) Entrada y string donde guardar Lee una línea y descarta el salto de línea Sí
s.size() Ninguno Cantidad de caracteres No
s.empty() Ninguno true si está vacío No
s[i] Índice 0 <= i < s.size() Permite leer o cambiar el carácter de esa posición Si asignás
s.front() / s.back() String con elementos Acceso al primer / último carácter Si asignás
s == t / s != t Otro texto Si los textos son iguales / diferentes No
s += t / s += c Texto o carácter Lo agrega al final Sí
s.push_back(c) Un carácter Lo agrega al final Sí
s.pop_back() String con elementos Quita el último carácter Sí
s.find(x, desde) Carácter o texto, inicio inclusivo Índice de la primera aparición desde ahí, o string::npos. desde vale 0 si se omite No
s.substr(pos, cant) Inicio y cantidad Nuevo string con ese fragmento. Sin cant, copia hasta el final No
s.erase(pos, cant) Inicio y cantidad Borra ese tramo. Sin cant, borra hasta el final. Devuelve el propio string Sí
s.insert(pos, t) Posición y texto Inserta t antes de esa posición. Devuelve el propio string Sí
s.replace(pos, cant, t) Inicio, cantidad a quitar y texto nuevo Reemplaza ese tramo por t. Devuelve el propio string Sí
s.clear() Ninguno Deja el string vacío Sí
count(s.begin(), s.end(), c) Rango completo y carácter Cantidad de apariciones de c No
stoi(s) / stoll(s) Texto que empieza con un entero representable Devuelve ese entero como int / long long No
to_string(x) Un entero Devuelve su representación como string No

En count, begin() señala el primer carácter y end() el límite posterior al último. La llamada recorre todo el texto.

Ejemplos

Crear, leer y acceder

string palabra = "CASA";
string marcas(4, 'X'); // "XXXX"
int n = static_cast<int>(palabra.size()); // 4

char primera = palabra[0]; // 'C'
palabra[1] = 'O';          // palabra queda "COSA"

size() devuelve un tipo sin signo. Si el largo cabe en int, guardarlo como en el ejemplo facilita las cuentas con índices y las restas.

string palabra;
cin >> palabra; // Lee hasta el siguiente espacio o salto de línea
int cantidad;
cin >> cantidad;
cin.ignore(numeric_limits<streamsize>::max(), '\n');

string linea;
getline(cin, linea); // Lee la línea siguiente, incluidos sus espacios

El ignore descarta lo que queda de la línea de cantidad. Cuando empezás directamente con getline, podés llamar a getline(cin, linea) sin ese paso previo.

Consultar extremos y comparar

string s = "CASA";
char primera = s.front(); // 'C'
char ultima = s.back();   // 'A'

bool igual = (s == "CASA");     // true
bool diferente = (s != "casa"); // true

La comparación distingue mayúsculas de minúsculas. front() y back() requieren al menos un carácter.

Agregar y quitar al final

string s = "CA";
s += "SA";        // "CASA"
s.push_back('!'); // "CASA!"
s.pop_back();     // "CASA"

pop_back() requiere un string con elementos. Para vaciarlo por completo, usá s.clear().

Buscar texto o un carácter

string s = "BANANA";
auto primera = s.find("ANA");      // 1
auto siguiente = s.find("ANA", 2); // 3
auto ausente = s.find('Z');        // string::npos

bool tieneAna = (primera != string::npos); // true

auto deja que el compilador deduzca el tipo. string::npos significa que la búsqueda no encontró una aparición. Una coincidencia en la posición 0 es válida, así que la comprobación de presencia es pos != string::npos.

Extraer una parte

string s = "ABCDE";
string parte = s.substr(1, 2); // "BC"
string sufijo = s.substr(3);   // "DE"
string corta = s.substr(3, 9); // "DE"

La cantidad se recorta a lo disponible. Empezar en s.size() devuelve un string vacío. Empezar más allá produce un error. s conserva su contenido.

Borrar sobre una copia

string original = "ABCDE";
string copia = original;
copia.erase(1, 2); // copia queda "ADE"
                  // original conserva "ABCDE"

El segundo argumento es una cantidad. Para borrar hasta el final, usá copia.erase(1). La posición puede llegar hasta size(). Después de editar, las posiciones de los caracteres posteriores pueden cambiar.

Insertar y reemplazar

string s = "CASA";
s.insert(2, "MI");    // "CAMISA"
s.replace(2, 2, "R"); // "CARSA"

replace quita dos caracteres desde la posición 2 y pone "R" en su lugar. El largo del texto nuevo puede ser distinto de la cantidad borrada. En ambas operaciones, pos debe estar entre 0 y size().

Contar un carácter

string s = "BANANA";
int cantidad = count(s.begin(), s.end(), 'A'); // 3

La llamada cuenta caracteres iguales a 'A'. Para buscar el texto "ANA", usá find.

Convertir entre texto y enteros

int chico = stoi("125");                    // 125
long long grande = stoll("123456789012");   // 123456789012
string texto = to_string(grande);           // "123456789012"

stoi y stoll pueden convertir un prefijo válido, como el 125 de "125abc". Dan error si no encuentran un entero inicial o si el resultado excede su tipo. En una entrada que garantiza un entero válido, elegí la función según el rango del valor.

Referencia técnica de C++17: strings, borrador N4659.