Entradas populares

viernes, 3 de septiembre de 2010

scanf con espacios en C++

Bueno pues, todo comenzo cuando en la U me mandaron a investigar sobre este tema y por más que busque nadie me pudo dar una respuesta obvia sobre el pequeñísimo problema del scanf y los espacios en blanco.
Navegando e investigando por la web encontré un sin número de formas para realizar la lectura de una variable char que soportara espacios. Pero ninguna resolvía el problema de una forma sencilla y práctica.
Por eso este post mostrare esa forma utilizando scanf, para leer variables char con espacio.
En concreto hablare de Borland C++ (ver 3.1), el cual a muchos de nosotros nos lo enseñan como lenguaje básico de programación ( si no aprendes C++ no aprenderás ninguno XD....).
Al iniciarnos en este lenguaje empezamos aprendiendo que la función main () es la principal y que toda función en C++ devuelve un valor, y otras cosas más, como capturar datos, realizar funciones matemáticas, array, string's, etc.…
En nuestro caso SCANF, función que analiza una entrada de datos con formato y cargando el resultado en el argumento (variable que se le asigna).

La sintaxis es simple scanf ("formato_de_datos",&argumento_o_variable);  el problemilla de esta función es que leerá datos hasta que encuentre un espacio.
Aquí sucede un gran error y a veces muy común, aunque nosotros hemos declarado nuestras variables con su respectivo buffer scanf interpretara que solo debe leer el valor hasta que encuentre un espacio. La solución más obvia es cambiar la función y permitir que podamos leer todos los datos y espacios posibles por eso algunos recomiendas gets(variable); Esta función si lee los espacios pero el problema es que es muy insegura además, cuando escribes una cadena demasiado largo gets(); toma el buffer de otra variable y lo asigna.Eso concluiría con una pérdida de datos.

Ej.:
#include<stdio.h>
#include<conio.h>

void main(){
   clrscr();
     char a[5], b[5];           //buffer de 5 incluyendo  \0
     printf("A: ");gets(a);    //Ingreso de variables con gets
     printf("B: ");gets(b);
     printf("var a: %s\n",a);  //MUESTRO VARIABLES
     printf("var b: %s\n",b);
getch();
}

Como vemos en el código anterior leo dos variable tipo char y le asigno su respectivo buffer(espacio de memoria asignado a la variable). Leo la variable a ingreso 10 caracteres, sin ningun problema ni restricción y luego b con 10 caracteres más y al momento de mostrar. Nos damos cuenta que los datos de la primera variable se han perdido.

Entonces que hacer ¿¿??... Bueno la solución a esto es muy sencilla luego de navegar un rato encontré que podías decirle a la función scanf que leyera tus datos hasta que encuentre un salto de línea (\n). ¿Pero cómo? sencillo como tú puedes pasar formato a tu scanf, ahí es donde le indicaras que lea hasta la siguiente expresión regular. Y tendríamos algo así: scanf (" %[^\n]",&variable);
Aunque lo encontré en la web, no sabía porque no me cogía los valor pues al parecer el truco es que dejes un espacio entre la apertura de comillas y el porcentaje, en pocas palabras quedaría algo como scanf("espacio % ; ahí el compilador reconocerás los espacios. Y no hará el tipo salto de datos, que suele suceder.
Espero que les sirva la información no es muy técnica pero les servirá en la practica si desean documentarse más visiten este post: http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

1 comentario:

MACMOUSE dijo...

maldito niño nerd....!!!