Post #4
Strings en C++
Bueno, creo que esto urgía más por lo del concurso, que seguir con las clases, así que voy a explicar ahora cómo se trabaja con strings en C++. Antes de nada como siempre os recuerdo que podéis trabajar con las strings de C incluyendo la librería . Sin embargo las strings en C++ son mucho más cómodas de usar porque no son arrays de caracteres, sino que son objetos, que facilita mucho las cosas. En C++ existe una clase llamada string, que está en la librería . Si creamos objetos de esa clase tendremos cadenas de caracteres donde guardar palabras, textos o lo que queramos. vamos a ver un ejemplo, donde creamos una cadena, guardamos en ella una frase y la mostramos con cout:
#include //para usar cin y cout
#include //para usar la clase string de C++, no confundir con
using namespace std;
int main() {
string frase; //también podíamos haber puesto directamente string frase = "Hola mundo!";
frase = "Hola mundo!";
cout << frase << endl; //mostramos Hola mundo! y un salto de línea
}
Además, las strings de C++ tienen algunas propiedades que no tenían los arrays de caracteres en
- Podemos copiar el contenido de una string A a otra string B sin necesidad de usar strcpy(), simplemente poniendo esto: "B = A;".
- Podemos comparar el contenido de dos cadenas, A y B sin necesidad de usar strcmp(), simplemente poniendo "A == B" dentro de un bucle, un if o lo que queramos.
- Si queremos concatenar dos cadenas (añadir una al final de la otra) podemos hacerlo sin necesidad de usar strcat(), simplemente usando += como haríamos con un entero. Por ejemplo supongamos que queremos añadir el contenido de una string A a otra string B, pues se haría así: "B += A;". Sirve también con caracteres sueltos entre comillas simples ('a','x','B') o con cadenas entre comillas dobles("hola","Hawkings","C++"). Es decir, que podemos hacer A += "ABC"; y ABC se añadirá al final de A, sin dejar ningún espacio por enmedio.
- Podemos conocer la longitud de una cadena A sin necesidad de usar strlen(), simplemente llamando a su función length() (vale, esto es casi lo mismo, pero no intentéis usar strlen() con una string de C++). Si lo preferimos también podemos usar size(). Ambas hacen lo mismo. Por ejemplo para crear un entero num cuyo valor sea la longitud de A simplemente ponemos "int num = A.length()" o bien "int num = A.size()". Yo suelo usar length(), porque es como se llama el método en java, pero size() hace exactamente lo mismo.
- Podemos leer una línea entera de la entrada (cin) o de cualqueir sitio sin miedo a salirnos del array, porque esto no es un array. Para ello en vez de gets usaremos getline(), que está en la librería string. Más adelante explico su uso.
- Si queremos leer de cin con >> una cadena podemos, pero parará de leer en cuanto se encuentre un espacio en blanco a no ser que configuremos cin de otra manera (que aún no sabemos).
- Podemos mostrar una cadena tranquilamente con "cout <
Otra cosa importante es que podemos acceder al carácter que esté en la posición N de la cadena con corchetes como si fuera un array, por ejemplo, si A = "¡ola!", después de hacer "A[0] = 'H';" A valdría "Hola!".
Ahora vamos a aprender a usar getline(). Es una función que recibe dos argumentos, el primero, de dónde va a leer la cadena (normalmente de cin) y el segundo es en qué cadena los va a guardar. Y ya está. Vamos a ver un ejemplo grande con strings en C++:
#include //para usar cin y cout
#include //para usar la clase string de C++, no confundir con
using namespace std;
int main() {
string cad1, cad2;
cad1 = "abc";
cad2 = cad1; //ahora tanto cad1 como cad2 valen "abc"
cad2 = "Abc"; //ahora cad2 vale "Abc" pero cad1 sigue valiendo "abc"
if(cad1 != cad2) { //si cad1 es diferente de cad2...
cout << cad1 << " es diferente de " << cad2 << endl; //esto muestra:
//abc es diferente de Abc
}
cad1 = "Abc";
if(cad1 == cad2) { //si cad1 es igual a cad2
//ahora sí entrarán aquí porque ambas valen Abc
cout << cad1 << " es igual a " << cad2 << endl;
}
cad1 += cad2; //ahora cad1 vale "AbcAbc"
/*
Ahora vamos a leer datos de la entrada estándar (cin)
*/
cin >> cad1; //si el usuario introduce "hola que tal?" solo se guardará "hola" (hasta
//el primer espacio en blanco)
getline(cin, cad2); //sin embargo aquí se guardaría "hola que tal?" todo entero
//mi recomendacion es leer las cadenas siempre con getline. Y tened cuidado si antes habíais leido con cin >>
//porque os puede dar problemas con getline. Ambos no se llevan bien, pero para arrelgarlo solo tenees que poner
//el getline dos veces seguidas.
/*
Ahora vamos a mostrar cad2 letra por letra, para ver cómo se opera con caracteres
sueltos de una cadena
*/
for(int i = 0; i < cad2.length(); i++) {//esta línea nos dará un warning, si queremos evitar que
//salga el warning solo tenemos que poner esto en lugar de la linea anterior
// for(unsigned int i = 0; i < cad2.length(); i++) {
//y a está. Sin embargo a pesar del warning no debería haber ningún problema en ponerlo así
cout << cad2[i]; //mostramos carácter a carácter la cadena
}
return 0;
}
Creo que no me dejo nada importante excepto los iteradores, que ya los veremos más adelante. Ahora procedo a postear el concurso propuesto por Lunnaris, creo que con eso ya tenéis suficiente para practicar xD.[/i]