Fundamentos de cadenas en C++

C++Beginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá sobre cadenas en C++. Aprenderá cómo definir e inicializar cadenas y cómo utilizar funciones de cadena.

Vista previa del contenido

C++ admite dos tipos de cadenas:

  1. Una cadena es un arreglo de char, terminado con un carácter NULL '\0' (Hex 0). También se le llama Cadena de Caracteres o Cadena de estilo C.
  2. La nueva clase string introducida en C++98.

Se recomienda la clase string "de alto nivel", porque es mucho más fácil de usar y entender. Sin embargo, muchos programas legados utilizan cadenas de C; muchos programadores también utilizan cadenas de C "de bajo nivel" para tener un control total y una mayor eficiencia; además, en algunas situaciones, como los argumentos de línea de comandos, solo se admiten cadenas de C. Por lo tanto, es posible que tenga que entender ambos tipos de cadenas.

  • Declaración e inicialización de cadenas
  • Entrada/salida de cadenas
  • Operación de cadenas

Declaración e inicialización de cadenas

Para utilizar la clase string, incluya el encabezado <string> y "using namespace std".

Puede declarar e inicializar una cadena con un literal de cadena, inicializarla a una cadena vacía o inicializarla con otro objeto de cadena. Por ejemplo:

#include <string>
using namespace std;

string str1("Hello");  // Inicializar con un literal de cadena (Inicialización implícita)
string str2 = "world"; // Inicializar con un literal de cadena (Inicialización explícita a través del operador de asignación)
string str3;           // Inicializar a una cadena vacía
string str4(str1);     // Inicializar copiando de un objeto de cadena existente

Entrada/salida de cadenas

Por ejemplo

/* Prueba de la entrada y salida de la clase string */
#include <iostream>
#include <string>     // Se necesita este encabezado para usar la clase string
#include <limits>
using namespace std;  // También se necesita para <string>

int main() {
   string message("Hello");
   cout << message << endl;

   // Ingresa una palabra (delimita por espacio) en una cadena
   cout << "Ingrese un mensaje (sin espacios): ";
   cin >> message;
   cout << message << endl;

   cin.ignore(numeric_limits<streamsize>::max(), '\n');
   // Limpia cin hasta el salto de línea (se necesita el encabezado <limits>)

   // Ingresa una línea en una cadena
   cout << "Ingrese un mensaje (con espacios): ";
   getline(cin, message);  // Lee la entrada de cin en message
   cout << message << endl;
   return 0;
}

Salida:

Hello
Ingrese un mensaje (sin espacios): hello
hello
Ingrese un mensaje (con espacios): hello world
hello world
descripción de la imagen

NOTAS:

  • Necesitamos "#include <string>" para usar la clase string, y "using namespace std" ya que string está definida en el espacio de nombres std.
  • "cin >> aStr" lee una palabra (delimita por espacio) de cin (teclado), y la asigna a la variable de cadena aStr.
  • getline(cin, aStr) lee toda la línea (hasta '\n') de cin, y la asigna a aStr. El carácter '\n' se descarta.
  • Para limpiar cin, se puede usar la función ignore(numeric_limits<streamsize>::max(), '\n') para descartar todos los caracteres hasta '\n'. numeric_limits está en el encabezado <limits>.

Operaciones con cadenas

  • Verificar la longitud de una cadena:

    string str("Hello, world");
    // Ambos devuelven la longitud de la cadena
    cout << str.length() << endl;  // 12
    cout << str.size()   << endl;  // 12
  • Comprobar si una cadena está vacía:

    string str1("Hello, world");
    string str2;                   // Cadena vacía
    // Comprueba si la cadena está vacía.
    cout << str1.empty() << endl;  // 0 (falso)
    cout << str2.empty() << endl;  // 1 (verdadero)
  • Copiar de otra cadena: Simplemente use el operador de asignación "=".

    string str1("Hello, world"), str2;
    str2 = str1;
    cout << str2 << endl;   // Hello, world
  • Concatenar con otra cadena: Use el operador más "+", o el operador compuesto más "+=".

    string str1("Hello,");
    string str2(" world");
    cout << str1 + str2 << endl;  // "Hello, world"
    cout << str1 << endl;         // "Hello,"
    cout << str2 << endl;         // " world"
    str1 += str2;
    cout << str1 << endl;  // "Hello, world"
    cout << str2 << endl;  // " world"
    string str3 = str1 + str2;
    cout << str3 << endl;  // "Hello, world world"
    str3 += "again";
    cout << str3 << endl;  // "Hello, world worldagain"
  • Leer/Escribir un carácter individual de una cadena:

    string str("Hello, world");
    // Devuelve el carácter en el índice, el índice comienza en 0. Realiza una comprobación de límite de índice.
    cout << str.at(0) << endl;  // 'H'
    cout << str[1] << endl;     // 'e'
    cout << str.at(str.length() - 1) << endl;  // 'd'
    
    str.at(1) = 'a';  // Escribe en el índice 1
    cout << str << endl;  // "Hallo, world"
    
    str[0] = 'h';
    cout << str << endl;  // "hallo, world"
  • Extraer sub-cadena:

    string str("Hello, world");
    // Devuelve la sub-cadena que comienza en beginIndex, de tamaño
    cout << str.substr(2, 6) << endl;  // "llo, w"
  • Comparar con otra cadena:

    string str1("Hello"), str2("Hallo"), str3("hello"), str4("Hello");
    cout << str1.compare(str2) << endl;   // 1   'e' > 'a'
    cout << str1.compare(str3) << endl;   // -1  'h' < 'H'
    cout << str1.compare(str4) << endl;   // 0
    
    // También puede usar el operador == o!=
    if (str1 == str2) cout << "Same" << endl;
    if (str3!= str4) cout << "Different" << endl;
    cout << boolalpha;  // imprime bool como true/false
    cout << (str1!= str2) << endl;
    cout << (str1 == str4) << endl;
  • Buscar/Sustituir caracteres: Puede usar las funciones disponibles en #include <algorithm>

    Por ejemplo,

    #include <algorithm>
    ......
    string str("Hello, world");
    replace(str.begin(), str.end(), 'l', '_');
    cout << str << endl;    // He__o, wor_d

Ejemplo

/* Ejemplo de función de cadena en C++ */
#include <iostream>
#include <string>    // usar la clase string
using namespace std;

int main() {
   string msg = "hello, world!";
   cout << msg << endl;
   cout << msg.length() << endl;  // longitud de la cadena
   cout << msg.at(1) << endl;     // carácter en el índice 1
   cout << msg[1] << endl;        // lo mismo que arriba
   cout << msg.empty() << endl;   // probar si la cadena está vacía
   cout << msg.substr(3, 3) << endl; // sub-cadena comienza en
                                     // pos 3 de tamaño 3
   cout << msg.replace(3, 3, "why") << endl; // reemplazar sub-cadena
   cout << msg.append("end") << endl;        // agregar al final
   cout << msg + "end" << endl;              // lo mismo que arriba
   cout << msg.insert(3, "insert") << endl;  // insertar después de la pos 3

   string msg1;
   msg1 = msg;   // copiar
   cout << msg1 << endl;

   cout << "Enter a line: ";
   getline(cin, msg);   // leer una línea de entrada
   cout << msg << endl;
}

Salida:

hello, world!
13
e
e
0
lo,
helwhy world!
helwhy world!end
helwhy world!endend
helinsertwhy world!end
helinsertwhy world!end
Enter a line: a
a
descripción de la imagen

Resumen

La cadena es otro tipo de datos importante aparte de los números. En esta sección, hablamos sobre el uso de cadenas. C++ ofrece muchos métodos útiles para manejar cadenas, aprende a usarlos con facilidad.