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:
- Solo se requiere un puntero para hacer referencia a toda la string. Eso muestra que esto es eficiente en memoria.
- 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:
- 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";
- 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; }
- 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
- 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.
- Compatibilidad con código C antiguo (aunque el método c_str() de std::string maneja la mayor parte de esto).
- 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:
- 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:
- Esta es una array de tamaño asignado estáticamente que consume espacio en la pila.
- 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; }
- 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