Está en la página 1de 17

C-Strings y Strings en C++

© Dr. Leonardo Garrido


Centro de Sistemas Inteligentes
Tecnológico de Monterrey
E-mail: leonardo.garrido@itesm.mx
Web page: http://www-csi.mty.itesm.mx/~lgarrido
Los cstrings
Algunos ejemplos de cstrings:
– “Computación II”
– “Hola”
Son arreglos de caracteres
Con un carácter especial para indicar su final
El carácter núlo: ´\0’
Ejemplo de la inicialización de un cstring:
– char Lenguajes[10] = “C++”;
© Dr. Leonardo Garrido Archivos Texto en C++
Formas de incialización

char ejemplo[10] = “Hola”;

char ejemplo2[] = “Adios”;

Pero cuidado con:


– char ejemplo3[20];
– ejemplo3 = “Cuidado”;

© Dr. Leonardo Garrido Archivos Texto en C++


Cuidado!

Qué pasa con el siguiente código:


– char ejemplo3[20];
– ejemplo3 = “Cuidado”;

Y qué pasará con algo así como:


– char ejemplo1[]=“hola”; char ejemplo2[]=“adios”;
– if (ejemplo1 = = ejemplo2) { ...

© Dr. Leonardo Garrido Archivos Texto en C++


Asignación de cstrings
Una opción es copiar elemento por elemento del
arreglo con algun estatuto de repetición.
Otra opción es usar la biblioteca <cstring>
En esta biblioteca tenemos disponibles
funciones tales como:
– strcpy(objetivo, origen)
– strcmp(cstring1, cstring2)
– strcat(objetivo, origen)
– strlen(cstring)
© Dr. Leonardo Garrido Archivos Texto en C++
Funciones de cstrings
Strcpy(objetivo, origen)
– Copia la cadena origen en la objetivo.
Strcmp(cstring1, cstring2)
– Da un 0 si son iguales
– Un valor - si la 1 es menor que la 2
– Un valor + si la 1 es mayor que la 2.
– El orden es obviamente lexicográfico.
Strcat(objetivo, origen)
– Anexa la cadena origen al final de la objetivo.
Strlen(cstring)
– Devuelve un entero con la longituda de la cadena.
– El carácter nulo no se cuenta.
© Dr. Leonardo Garrido Archivos Texto en C++
Advertencia
Uno de los principales problemas es que los
cstrings y las funciones en la biblioteca
<cstring> son muy peligrosas!

No se pueden usar el = y el == directamente.


La función strcpy no checa que la cadena
objetivo tenga sufuciente espacio.
La función strcat tampoco lo checa.

© Dr. Leonardo Garrido Archivos Texto en C++


Los cstrings como parámetros
Como cualquier otro arreglo los cstrings pueden
ser pasados como parámetros (ya sea por valor o
por referencia).
Recuerdan que otro parámetro se pasa
generalmente a una función junto con un
arreglo? ... Y por qué?

Reflexión: por qué fallan las funciones de los


cstrings que vimos?
© Dr. Leonardo Garrido Archivos Texto en C++
I/O de cstrings
Qué efecto tendrá la siguiente línea de código:
– char cadena[10]=“ y adios”;
– cout << “Hola” << cadena;
Se pueden leer cadenas con el “cin” pero
cuidado con los espacios y tabs!
La solución es usar el método (función
miembro) “getline” de todo objeto de “flujo de
entrada”. Por ejemplo:
– char ejem[80];
– cin.getline(ejem, 80);
© Dr. Leonardo Garrido Archivos Texto en C++
Nuestra propia función

Origen
strcpy Destino
Destino

Origen
Destino copiaCadena Destino
Long
Destino
© Dr. Leonardo Garrido Archivos Texto en C++
Los cstrings y los números
Cuáles son cstrings y cuáles son int?
– 12345
– “12345”
– “12,345”
Es común tener que convertir estos datos en
nuestros programas.
Una solución es hacer nuestros propias
funciones de conversión.
Otra opción es usar la biblioteca <cstdlib>
© Dr. Leonardo Garrido Archivos Texto en C++
Los cstrings y los números
Dentro de <cstdlib> tenemos algunas funciones
útiles para cstrings como:
– atoi(cstring) que convierte el cstring a un int.
– atol(cstring) que convierte el cstring a un long.
– atof(cstring) que convierte el cstring a un double.

Si el cstring de entrada no es válido entonces


regresa un valor de 0 (cero) como int, long o
double, según sea el caso.
© Dr. Leonardo Garrido Archivos Texto en C++
La buena noticia: la clase string

La principal ventaja es de que efectivamente se


trata de una clase ... No de un arreglo!

Los strings se usan como objetos en lugar de


arreglos (tal como se hace en Java).

Se usa con la biblioteca <string>


© Dr. Leonardo Garrido Archivos Texto en C++
Ventajas básicas de la clase string
Tiene constructores para la inicialización:
– string cadena1;
– string cadena2(“hola”);
La asignación y comparación:
– cadena1 = cadena2;
– if (cadena1 = = cadena2) ...
Los otros operadores relacionales (>, <, etc)
también funcionan como dice el sentido común.
La entrada y salida de datos usando cin y cout
también funcionan normalmente.
© Dr. Leonardo Garrido Archivos Texto en C++
Más detalles de la clase string
Para concatenar dos string se usa el operador +:
– string str1(“hola”), str2(“ y adios”);
– cout << str1+str2;
Existe una función libre (una función amiga)
llamada getline para leer strings. Por ejemplo
para leer una frase:
– string str1;
– cout << “Escribe una frase\n”;
– getline(cin, str1)
© Dr. Leonardo Garrido Archivos Texto en C++
Caracteres de la clase string
Se puede accesar los caracteres individuales de
un string tal como se hace con los cstrings:
– string str1(“hola”);
– cout << str[2];
Pero lo más recomendable es usar el método
“at” de la clase string:
– string str1(“hola”);
– cout << str.at(2);
Esto es recomendable porque este método sí
verifica que el índice sea válido.
© Dr. Leonardo Garrido Archivos Texto en C++
Algunos métodos de la clase string
Esta clase tiene más de 100 métodos! Algunos
por ejemplo son:
– string str1, str2;
– str1.length()
– str1.substr(ubicación, longitud)
– str1.empty()
– str1.insert(ubicación, str2)
– str1.remove(ubicación, longitud)
– str1.find(str2)
© Dr. Leonardo Garrido Archivos Texto en C++