[C con Clase] no me funciona !!! no puedo reproducir el programa

Salvador Pozo salvador en conclase.net
Lun Feb 27 10:33:57 CET 2012


El pasado 2012-02-27 02:27:48, Ernesto Mercado LImon escribió:
 
EML> es que lo que pasa es que cuando trato de escribir un nombre con espacios me manda hasta el final del programa y no paso por paso . aqui esta el programa quisiera ver en donde estoy mal!!! 

El problema está en la función "scanf". Esta función, cuando se usa para leer cadenas, está diseñada para usar como separadores los espacios y los tabuladores. Es decir, la lectura de la cadena se interrumpe cuando se encuentra el primer espacio en blanco.

Así, si el nombre de la prenda es "camisa negra", por ejemplo, se asigna "camisa" a la cadena nombre, y el resto del texto se queda en el buffer de entrada a la espera de la siguiente lectura.

La siguiente lectura, en tu programa, es la del precio, así que el programa intenta asignar "negra" a la variable a. Como evidentemente no se trata de un número, el resultado es algo raro, porque se trata de una entrada no prevista.

Para leer cadenas que contengan espacios, las librerías C disponen de dos funciones: gets y fgets.

La primera está desaconsejada, ya que no es segura. La inseguridad proviene de que no se limita la longitud de la cadena leída. Por ejemplo, en este caso nombre tiene 50 caracteres, pero si usamos la función gets el usuario podría introducir más caracteres, y la función los leería todos, usando memoria que no pertenece a nombre, y contaminando memoria usada por otras variables, por código, o contaminando la pila. En cualquier caso, un funcionamiento peligroso.

En su lugar es preferible usar fgets, que sí puede limitar el número de caracteres leídos. Esta función está pensada para leer desde ficheros, pero el fichero de entrada puede ser stdin, es decir, el teclado:

fgets(nombre, 50, stdin);

De este modo, se leen de teclado como máximo 50 caracteres (incluido el nulo terminador de cadena), pero podrían ser menos si se encuentra un retorno de línea.

No se debe considerar que el comportamiento de scanf y gets es un error. Estas funciones tienen muchos años de vida, desde 1972, y estaban pensadas para otro tipo de terminales y sobre todo, para que los programas fuesen usados por personal especializado, responsable y que seguía las instrucciones al pié de la letra.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase