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ón | Descripción | Ejemplo |
|---|---|---|
| Concatenación | Une dos cadenas | a + b |
| Longitud | Devuelve el número de caracteres | a.length() o a.size() |
| Acceso a caracteres | Acceso por índice | a[0], a.at(2) |
| Subcadena | Extrae una parte de la cadena | a.substr(2, 4) |
| Comparación | Comparación alfabética | a.compare(b) |
| ¿Vacía? | Comprueba si la cadena está vacía | a.empty() |
| Limpiar | Elimina el contenido | a.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()yto_string(). getline()permite leer texto que contiene espacios.- Todos los ejemplos pueden ejecutarse en Visual Studio 2022 o GCC 11+.