Post #17
En este post por fin vamos a aprender a trabajar con strings. La palabra string viene del inglés y significa cadena. Y una string es eso, una cadena de caracteres, es decir un conjunto de números, letras y caracteres especiales como '#' o '@', es decir, una string es un array de caracteres. Sin embargo no todos los arrays de caracteres son strings. La diferencia es que una cadena siempre termina con el carácter '\0' (contrabarra cero). Esto no significa que el último elemento del array tenga que ser \0 sino que todo lo que haya después de ese carácter se ignorará. Vamos a ver un pequeño ejemplo. En este ejemplo simplemente mostramos con printf una cadena. Para mostrar cadenas con printf se usa %s (igual que para enteros usábamos %i y para caracteres %c).
#include
int main() {
char string[6] = { 'H', 'o', 'l', 'a', '\0', '!' };
printf("%s\n",string);
return 0;
}
Como vemos el '!' no se muestra porque está después del '\0'. Escribir las cadenas así es demasiado trabajoso, así que podemos simplemente escribirlas entre comillas y automáticamente se le pone el \0 al final. Por ejemplo, vamos a ver otra vez el ejercicio anterior pero ahora de la nueva forma, con comillas.
#include
int main() {
char string[6] = "Hola";
printf("%s\n",string);
return 0;
}
como véis el array es de 6 caracteres, y la cadena mide 5 (4 más el '\0'). No pasa nada si hacemos un array de 200 caracteres y ocupamos solamente 1. Sin embargo si hacemos un array de 10 chars e intentamos guardar en él una cadena de 15 nos dará error. Este es uno de los posibles usos de realloc. Hacemos un puntero a char y según los caracteres que vayamos a guardar lo hacemos más grande o más pequeño.
Hay una serie de funciones en la librería que nos pueden ser muy útiles a la hora de trabajar con cadenas. Podéis ver una lista de todas en http://cplusplus.com/reference/clibrary/cstring/. Pone cstring porque así es como se llama la librería en C++, pero las funciones hacen lo mismo. Ya sé que está en inglés pero están todas con ejemplos y muy bien explicadas. Os explicaré en español aquí las que más se usan:
-
strcpy(destino, origen): copia el contenido de origen en la cadena destino. Todo el contenido de la cadena destino se pierde. Es importante recordar que no podemos copiar cadenas con "=" porque estaríamos asignando la dirección de memoria y si cambiamos una cambia la otra.
-
strcat(destino, origen): añade el contenido de la cadena origen al final de la cadena destino, o lo que es lo mismo concatena origen al final destino. Es decir si la cadena origen contenía " Mundo" y la cadena destino contenía "Hola" después de usar esta función la cadena origen seguirá conteniendo lo mismo pero la cadena destino ahora contendrá "Hola Mundo". Además esta función devuelve una cadena exactamente igual que destino una vez añadido el nuevo contenido.
-
strcmp(cadena1, cadena2): comprueba si el contenido de la cadena1 es el mismo que el de la cadena2. Devuelve 0 si las cadenas son exactamente iguales. Devuelve un valor positivo si el primer carácter que no es igual en ambas cadenas es mayor en la primera y un valor negativo en cualquier otro caso. Recordad que no podemos usar el operador "==" para comparar el valor de dos cadenas porque esto lo que haría es ver si apuntan a la misma dirección de memoria.
-
strlen(cadena): devuelve la longitud de la cadena que recibe, sin contar el '\0' ni nada que haya después. Por ejemplo si cadena es "123" strlen devolverá 3.
Aún faltan algunas funciones para leer y mostrar cadenas. Éstas no están en sino en y son las siguientes: -
gets(cadena): lee por teclado hasta que pulses ENTER y guarda todo lo que el usuario ha escrito antes de pulsar ENTER. Tenéis que tener MUCHO cuidado al usar esta función, ya que no limita el máximo de caracteres a leer, así que nos arriesgamos a que intente meter más caracteres de los que caben a la cadena.
-
fgets(destino,N,flujo): lee un máximo de N-1 caracteres del flujo de datos flujo y lo introduce en la cadena destino. Para leer la entrada normal por teclado en flujo pondremos stdin (standard input), es decir, que quedaría por ejemplo puts. Si en algún momento llega a leer un carácter de nueva línea (\n) parará de leer, pero el carácter '\n' lo incluirá en la cadena (es decir, que para al pulsar ENTER pero lo incluye en la cadena). Después de leer los N-1 caracteres o cuando lee '\n' mete todos los caracteres en la cadena y al final el carácter '\0' para que sea una cadena válida.
-
scanf(): también se puede usar para leer cadenas, usando %s como identificador, sin embargo para de leer al encontrar un espacio en blanco (' '), un tabulador ('\t') o un carácter de nueva línea ('\n). No incluye ninguno de estos caracteres en la cadena, pero en su lugar pone un carácter '\0'.
-
puts(cad): muestra la cadena cad por pantalla, con un carácter de nueva línea al final. Es equivalente a hacer printf("%s\n",cad). Tened en cuenta que no hace falta que sea una variable lo que reciba, podéis poner directamente puts("HOLA") por ejemplo.
Ejercicio 36 (B): Diseña un programa que pida dos cadenas y a la primera le concatene la segunda. Después mostrará la primera cadena por pantalla.
Ejercicio 37 (B): Crea un programa que pida al usuario dos cadenas y diga si son iguales.
Ejercicio 38 (B): Crea un programa que pida al usuario una cadena y muestre su longitud incluyendo el carácter '\0'.
Ejercicio 39 (A): Diseña un programa que pida al usuario un número N. Después el programa reservará suficiente espacio como para guardar N caracteres, y leerá por teclado un máximo de N caracteres. Al final mostrará la cadena leida por pantalla, pero si la cadena acaba por '\n' no mostrará este carácter.