char* vs std:string vs char[] en C++

En este artículo, vamos a inspeccionar tres formas diferentes de inicializar strings en C++ y analizaremos las diferencias entre ellas.

1. Usar caracteres*

Aquí, str es básicamente un puntero al literal de string (const). Sintaxis:

char* str = "This is GeeksForGeeks";

Ventajas:

  1. Solo se requiere un puntero para hacer referencia a toda la string. Eso muestra que esto es eficiente en memoria.
  2. No es necesario declarar el tamaño de la string de antemano.

CPP

// CPP program to illustrate *char
#include <iostream>
using namespace std;
 
int main()
{
    // pointer str points to const string literal "Hello".
    // No need to declare size.
    char* str1 = "This is GeeksForGeeks";
 
    cout << str1 << endl;
 
    int size = 30;
 
    // can allocate size dynamically.
    char* str2 = (char*)malloc(sizeof(char) * size);
 
    str2 = "GeeksForGeeks For Everyone";
 
    cout << str2;
 
    return 0;
}

Producción:

This is GeeksForGeeks
GeeksForGeeks For Everyone

Contras:

  1. Esto funciona bien en C, pero escribir de esta forma es una mala idea en C++. Es por eso que el compilador muestra una advertencia de «conversión obsoleta de constante de string a ‘char *'» porque en C los literales de string son arrays de caracteres, pero en C++ son arrays constantes de caracteres. Por lo tanto, use la palabra clave const antes de char*.
const char* str = "This is GeeksForGeeks";
  1. No podemos modificar la string en una etapa posterior del programa. Podemos cambiar str para señalar otra cosa, pero no podemos cambiar el valor presente en str. Consulte storage-for-strings-in-c para obtener más detalles. 

CPP

// CPP program to illustrate assigning
// *char value to other variable
#include <iostream>
using namespace std;
 
int main()
{
    // This initialization gives warning in C++.
    // "deprecated conversion from string constant
    // to 'char*'"
    char* str = "Hello";
 
    const char* str1 = "Hello"; // No warning
 
    // trying to modify const string literal
    // gives Runtime error
    str[1] = 'o';
 
    cout << str << endl;
 
    return 0;
}
  1. Producción:
Segmentation Fault

2. Usando std::string

Sintaxis:

std::string str = "This is GeeksForGeeks";

Aquí str es el objeto de la clase std::string que es una instanciación de la plantilla de clase basic_string que usa char (es decir, bytes) como su tipo de carácter. Nota: No utilice las funciones cstring o string.h cuando declare una string con la palabra clave std::string porque las strings std::string son del tipo de clase basic_string y las strings cstring son del tipo const char*. Pros: Cuando se trata exclusivamente en C++ , std:string es la mejor manera de hacerlo debido a mejores funciones de búsqueda, reemplazo y manipulación. Algunas de las funciones útiles de std:string se analizan a continuación. 

CPP

// CPP program to illustrate
// std::string functions
#include <iostream>
using namespace std;
 
int main()
{
    // string assignment
    string s1 = "Hello";
    string s2 = "World";
 
    // return length of string
    cout << s1.size() << endl; // 5
    cout << s2.length() << endl; // 5
 
    // concatenate string using + operator.
    s1 = s1 + s2;
    cout << s1 << endl; // HelloWorld
 
    // append string
    s1.append("Geeks");
    cout << s1 << endl; // HelloWorldGeeks
 
    string s3 = "HelloWorldGeeks";
 
    // compare two strings
    if (s1.compare(s3) == 0)
        cout << "true" << endl;
    else
        cout << "false" << endl;
 
    // substring of string s1
    // substr(pos, length_of_substring)
    string sub = s1.substr(0, 5);
    cout << sub << endl; // Hello
 
    // insert into string
    // insert(pos, string)
    s1.insert(10, "For");
    cout << s1 << endl; // HelloWorldForGeeks
 
    string target = "World";
 
    // find a target string in s1
    size_t pos = s1.find(target);
    if (pos != std::string::npos) // npos=-1
        cout << "Found at Position:" << pos << endl; // pos=5
 
    // replace a portion of string s1
    // replace(pos, length_of_portion, string_to_replace)
    cout << s1.replace(5, 5, "Geeks") << endl; // HelloGeeksForGeeks
 
    return 0;
}

Producción:

5
5
HelloWorld
HelloWorldGeeks
true
Hello
HelloWorldForGeeks
Found at Position:5
HelloGeeksForGeeks

Casos en los que podría preferir char* sobre std:string

  1. Cuando se trata de acceso de nivel inferior, como hablar con el sistema operativo, pero por lo general, si está pasando la string al sistema operativo, entonces std::string::c_str lo tiene cubierto.
  2. Compatibilidad con código C antiguo (aunque el método c_str() de std::string maneja la mayor parte de esto).
  3. Para conservar memoria (std::string probablemente tendrá más sobrecarga).

3. Usando char[]

Sintaxis:

char str[] = "This is GeeksForGeeks";
     or 
char str[size] = "This is GeeksForGeeks";
//  Here str is a array of characters denoting the string.

Ventajas:

  1. Podemos modificar la string en una etapa posterior del programa.

CPP

// CPP program to illustrate char
#include <iostream>
using namespace std;
 
int main()
{
 
    char str[] = "Hello";
    // or char str1[]={'H', 'e', 'l', 'l', 'o', '\0'};
 
    // modify string to "Hollo"
    str[1] = 'o';
 
    cout << str << endl;
 
    return 0;
}

Producción:

Hollo

Contras:

  1. Esta es una array de tamaño asignado estáticamente que consume espacio en la pila.
  2. Necesitamos tomar el tamaño grande de la array si queremos concatenar o manipular con otras strings, ya que el tamaño de la string es fijo. Podemos usar la biblioteca estándar de C++ cstring o string.h para ese propósito. 

CPP

// CPP program to illustrate char
// concatenation using standard functions
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    // take large size of array
    char str[10] = "Hello";
 
    cout << "Before Concatenation : " << str << endl; // Hello
    strcat(str, " World");
    cout << "After Concatenation : " << str; // Hello World
 
    return 0;
}
  1. Producción:
Before Concatenation : Hello
After Concatenation : Hello World

Aquí hay un par de otras funciones útiles de la biblioteca estándar de C++ cstring

CPP

#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    char s1[10] = "Hello";
 
    // return length of s1
    cout << strlen(s1) << endl;
 
    char s2[50];
 
    // copies s1 into s2
    strcpy(s2, s1);
    cout << s2 << endl;
 
    char s3[10] = "World";
 
    // concatenates s3 into s2
    strcat(s2, s3);
    cout << s2 << endl;
 
    char s4[50] = "HelloWorld";
 
    // return 0 if s2 and s4 are equal.
    if (strcmp(s2, s4) == 0)
        cout << "true" << endl;
    else
        cout << "false" << endl;
 
    char s5[30];
 
    // copies first 5 chars of s4 into s5
    strncpy(s5, s4, 5);
    cout << s5 << endl;
 
    char target[10] = "Hello";
 
    // search for target string in s4
    if (strstr(s4, target) != NULL)
        cout << "true" << endl;
    else
        cout << "false" << endl;
 
    return 0;
}

Producción :

5
Hello
HelloWorld
true
Hello
true

Este artículo es una contribución de Kshitiz Gupta . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *