lunes, 12 de marzo de 2012

Vector de string


Para poder leer un vector de string, es decir un vector que en cada posición almacene una cadena de caracteres deberá de manejarse como una matriz la cual la cantidad de filas sera el numero de valores cadena que queramos ingresar y el número de columnas sera la cantidad de caracteres que puede almacentar cada valor, es decir si queremos almacenar 10 nombres de personas y que cada nombre tenga como maximo 30 caracteres, deberiamos de declarar nuestra matriz de la siguiente forma:

char Vnombres[10][30]

El siguiente ejemplo pedira los 10 nombres por pantalla y luego los mostrarara con el objetivo de demostrar la forma en que deben igresarse y mostrarse estos valores:


#include<stdio.h>
int main()
{
    //declaracion del arreglo de 10 posiciones y cada posicion almacenará 30 caracteres máximo
    char vnombres[10][30];
    int i=0;

   //ciclo para pedir los 10 nombres por pantalla
    for (i=0;i<10;i++)
   {
        printf("Ingrese nombre %i :",i+1);
        //note el uso de & debido a que estamos grabando el contenido en la posicion [0]   de la fila
        //esto porque recuerde que las cadenas son majenadas como punteros entonces lo que en
       //realidad tenemos es un apuntador al primer caracter de la cadena almacenada en la fila i     
        scanf("%s",&vnombres[i][0]);    
   }
   //ciclo para mostrar los 10 nombres ingresados anteriormente en la pantalla
   for (i=0;i<3;i++)
   {
       printf("los nombres ingresados son : \n");
       //note que siempre se lee y se muestra la fila correspondiente sobre la columa 0 que es la
       //posicion del primer caracter de la cadena de cada fila
       printf("%s \n",&vnombres[i][0]);
   }
   getch();
   
}

sábado, 25 de febrero de 2012

Lectura de caracteres por teclado con scanf, gets y fgets


Existen varias instrucciones para leer datos de tipo cadena en C ANSI pero algunas tienen diferente forma de manejarlos, tal es el caso de la instrucción scanf, la instrucion gets y la instrucción fgets las cuales explicaremos a continuación:

Funcion scanf:

Esta función es utilizada para capturar datos ingresados por el usuario indicandole un formato del tipo de datos que se espera por pantalla, lo que quiere decir que esta funcion nos sirve para leer varios tipos de datos como lo son: int, double, char,float, etc. y la sintaxis es la siguiente:

scanf("<especificacion del tipo de dato> ",<variable en la que se almacenara el valor ingresado>);

<especificacion del tipo de dato>: en este parametro podemos incluir los siguientes que son los más básicos, recuerde que estos parametros van encerrados dentro de comillas:

"% i" :  para valores enteros
"%d" :  para valores dobles
"%f" :   para valores con punto flotante (decimales)
"%s" :  para cadenas de carácteres
"%c":  para un caracter

Ejemplo de una instruccion que lee por pantalla una valor tipo cadena y un valor tipo entero:

scanf("%s", cadena);
scanf("%i", &numero);

Si notan en la segunda instruccion se uso el simbolo "&" y en la primera no se usa, esto es porque en el scanf necesitamos indicar que es un apuntador hacia el valor que se esta ingresando y los tipos cadena ya son un apuntador por default en C mientras que los enteros no lo son y es por ello que hay que indicarlo anteponiendo el simbolo "&"

problema con cadenas: La instrucción scanf cuando lee cadenas de caracteres leera unicamente hasta donde encuentre un espacio en blanco ignorando todo el demas contenido de dicha cadena, quedando basura en el buffer de lectura y esto lo toma como otra entrada del teclado por cada espacio en blanco que encuentre.

Funcion gets:

La función gets() no hace comprobación del límite de caracteres, es decir nada impedirá al usuario teclear más caracteres de los que soporta la variable que declaramos. La consecuencia de ello es imprevisible, aunque con toda seguridad el programa no funcionará correctamente.
Es importante tener en cuenta que no se permite la asignación de cadenas de caracteres mediante el operador =frase = gets ().

La sintaxis de esta instruccion es la siguinte y solo sirve para leer cadenas de caracteres:

gets(<variable en la que se almacenara el valor ingresado>);

ejemplo:  gets(nombre);

 Esta funcion si permite el ingreso de cadenas de caractéres que poseen espacios en blanco, es decir que podemos ingresar frases completas y tomara como entrada hasta que se presione la tecla <Enter>


fgets:     char *fgets(char *cadena, int n, stdin)

Esta función lee como máximo uno menos que el número de caracteres indicado por n desde el stream apuntado por stream al array apuntado por cadena. Ningún carácter adicional es leído después del carácter de nueva línea "\n".   Un carácter nulo es escrito inmediatamente después del último carácter leído en el array.   Ejemplo para leer una cadena de 80 caracteres se debe hacer de la siguiente forma:


linea[81];  //primero mi variable debe ser de 81 porque recuerden que al final le            //insertara el caracter de fin "\0".

fgets(linea,81,stdin)  //stdin porque nuestros datos provienen del teclado, cuida                       //do porque este parametro cambia cuando la lectura es de                        //archivo 


en linea recibe 80 caracteres mas el caracter de "\0" por esa razon se declaro de tamaño 81 la variable.