Trabajar con cadenas de texto en C.

Si has creado algún documento interesante, este es su sitio

Moderador: Moderadores

Trabajar con cadenas de texto en C.

Notapor Nork » Lun Nov 19, 2007 11:58 pm

Buenas, pues este post es para todos aquellos que piensan:

Código: Seleccionar todo
saludo="Hola";


Saber que tenemos unas funciones especificas para trabajar con cadenas de letras o letra.
Primero de todo os diré formas de leer una cadena de texto escrita por un usuario.

Si definimos una variable char asignándole un espacio pensar que siempre debemos reservar uno mas para el valor nulo(\0) que hay al final. El valor nulo se utiliza para hacerle saber al programa donde acaba. Así que de este modo la palabra Adiós no valdrá 5 sino 6 [Adios(\0)].

Hasta ahora seguramente la mayoría de las veces para la información de entrada utilicéis scanf pero que pasa si pedimos al usuario que escriba su nombre y primer apellido y utilizamos scanf? Probarlo si queréis... scanf sólo recogerá la cadena de texto hasta el primer valor nulo que vea, por lo que Juan Perez valdrá con esta función Juan.

¿Qué tenemos que utilizar entonces?

Os diré dos funciones que podéis utilizar para la entrada y salida manejando cadenas de texto.

gets()


Esta función recoge la cadena de texto entera, saltándose los valores nulos que pudieran haber por el medio. Por lo que en el ejemplo anterior de Juan Perez utilizando la funcion:

Código: Seleccionar todo
gets(nombre);


Ahora si que nombre valdría la cadena completa.

puts()

Se puede utilizar para mostrar cadenas de texto en pantalla:

Código: Seleccionar todo
 puts(nombre);


Que equivaldría a printf("%s", nombre);

Vale ahora ya sabemos leer y mostrar cadenas de texto. ¿Cómo podemos utilizarlas?

Para añadir una cadena a una variable no se puede hacer:

Código: Seleccionar todo
saludo="Hola";


Ya que las dos cadenas estarían en el mismo punto de memoria y al cambio de una de ellas en otra se vería afectada. Para solucionar este problema se puede utilizar:

strcpy(valordestino,valorinicial);

Por lo que en un ejemplo sería:

Código: Seleccionar todo
strcpy(saludo,"Hola");


Bien pero a veces lo que queremos es unir cadenas de texto en una sola variable, pues para ello utilizamos la función strcat, veamos un ejemplo:

Código: Seleccionar todo
strcat(nombre, apellidos)


Por lo que en la variable nombre quedaría el nombre y junto los apellidos.
Veamos un ejemplo de algunas cosas que hemos visto hasta ahora:

Código: Seleccionar todo
#include<stdio.h>
#include<string.h>

int main(){
     char nombre[40];
     char apellido1[10];
     char apellido2[10];

     printf("Escribe tu nombre:\n");
     gets(nombre);
     printf("Escribe tu primer apellido:\n");
     gets(apellido1);
     printf("Escribe tu segundo apellido:\n");
     gets(apellido2);

    strcat(nombre, " ");
    strcat(apellido1, " ");
    strcat(nombre, apellido1);
    strcat(nombre, apellido2);

   printf("Bienvenido %s", nombre);

   return 0;
}


También hay a veces que queremos comprobar que un texto sea igual a otro, para esto tenemos la funcion strcmp que lo que hace es:

Si devuelve un valor 0 -> La cadena es igual
Si devuelve un valor negativo -> La primera cadena que compara es más pequeña.
Si devuelve un valor positivo -> La segunda cadena que compara es más pequeña.

Un ejemplo:
Código: Seleccionar todo
#include<stdio.h>
#include<string.h>

int main() {
    char frase1[100];
    char frase2[100];
    int comp;

    printf("Escribe la primera palabra:\n");
    gets(frase1);
    printf("Escribe la segunda palabra:\n");
    gets(frase2);

    comp=strcmp(frase1,frase2);

   if (comp==0)
      printf("Las palabras son iguales.\n");
   else if(comp<0)
      printf("La primera palabra es menor.\n");
   else
      printf("La segunda palabra es menor.\n");

   return 0;
}

Lo que quiere decir con menor o mayor es la posición que esta respecto a la tabla ASCII, por lo que alfombra sera menor que zapatilla ya que la a viene antes que la z. Pero que pasaría si comparamos alfombra con Zapata? Que el menor aquí ( el que esta antes en la tabla ASCII) es Zapata ya que las mayúsculas vienen antes que las minúsculas.

Bueno sobre trabajar cadenas de texto hay muchísimo mas, pero lo que pretendía con esto es que sepáis que existen estos métodos mas correctos y que los uséis.

Saludos! ;)

***************He Añadido esta parte después de darme cuenta de algunas cosas******

Bueno como universalsac me hace saber que gets() es una función insegura ya que puede provocar desbordamientos de memoria y por eso voy a explicar un método para que lo podáis sustituir.

Se me olvidaba... cuando vais a utilizar strcpy podéis recurrir a strncpy para copiar los caracteres que queráis, ejemplo:

Código: Seleccionar todo
strncpy(nombre,apellidos,4);


Aquí se le añadirá a la variable nombre los 4 primeros caracteres de apellidos.

Vale, una vez explicado esto pasemos a la función fgets()...

fgets() le asignaremos la variable destino y el tamaño que deberá coger, nada mejor que un ejemplo:

Código: Seleccionar todo
#include<stdio.h>
#include<string.h>

int main(){
   char nombre[6];
   char apellido[3];
   
   printf("Escriba su nombre:");
   fgets(nombre,4,stdin);
        fflush(stdin);

   printf("Escriba su apellido:");
   fgets(apellido,4,stdin);
   strcat(nombre, apellido);
        fflush(stdin);

   printf("Su nombre completo es %s", nombre);
   return 0;
}


Así solamente cojera las 3 primeras palabras de la cadena... la función fflush lo que hace es limpiar el buffer del teclado, sé y soy el primero que lo dice que esta función no esta definida para hacer esta faena... pero no he encontrado otra solución mas rápida. Bueno pues aclarado esto; Saludos! ;)
La televisión me ha culturizado porque cada vez que la encienden en casa me voy a leer a mi cuarto.
Avatar de Usuario
Nork
<|:-)
<|:-)
 
Mensajes: 476
Registrado: Dom Feb 11, 2007 1:00 am
Ubicación: 2348,8574,7

Volver a Faq

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado