/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Leer con scanf frases con espacios en blanco...

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Daniel316



Registrado: 13 Ene 2008
Mensajes: 44
Ubicación: Argentina-Santa Fé-Arequito

MensajePublicado: 08/09/2010 5:19 pm
Título: Leer con scanf frases con espacios en blanco...

Hola a todos.
Les dejo mi programita para ver si alguien me puede dar una mano para saber que debo hacer para salir del bucle while, lo intente de diversas manera pero nada, lo que supongo es que
el scanf al leer lo último que hay en el buffer no sigue leyendo una ves mas para que la variable frase contenga algo que me diga que no hay mas nada en el mismo.-
Para no hacerles perder demasiado tiempo les informo que conozco las funciones gets y fgets, pero quiero hacerlo con scanf para indagar un poco mas en el lenguaje.-

Código:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char frase[100];
   printf("\n\tIngrese una frase con espacios...:");

   while(scanf("%s",frase))
   {
        printf("\n\t%s\n\t",frase);
   }

   return 0;
}


Bueno espero ayuda.-

Saludos.
Daniel
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2543
Ubicación: Valladolid (España)

MensajePublicado: 08/09/2010 7:33 pm
Título:

El problema radica en que (scanf) con el especificador de formato (%s) solo imprime una palabra (flujo de caracteres aislados por tabulador o un blanco).

Un especificador que admite texto:
Código:
scanf("%10[^\n]", mem);

Donde (mem) es un array y (10 u otro número) indica el maximo de caracteres almacenados, esto si no hay un salto de linea antes que además es descartado. El array debe definirse para N elementos (ejemplo 10) más uno dedicado al byte nulo.

·?0ƒ·
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
Daniel316



Registrado: 13 Ene 2008
Mensajes: 44
Ubicación: Argentina-Santa Fé-Arequito

MensajePublicado: 09/09/2010 8:08 am
Título:

Hola cheroky
Muchas gracias por responder, también tenia esa sentencia, bueno seguiremos indagando.-

Saludos.
daniel
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2543
Ubicación: Valladolid (España)

MensajePublicado: 09/09/2010 9:27 am
Título:

Aham entiendo... juraria que esta mañana no vi ningún código, en fin...

Para salir del bucle lo mas sencillo es comprobar los elementos introducidos, en este caso uno (la cadena), si no se introduce nada sale del bucle ya que (scanf) retorna el numero de estos. Otro problema viene dado a que el salto de linea descartado queda en el buffer (tampón) intermedio.

Sin comprobar EOF:

Código:
char frase[100];
 
   puts("Ingrese una frase con espacios...:");
   
   while(scanf("%99[^\n]", frase) == 1)
   {
        puts(frase);
   
        while(getchar() != '\n');
   }
   
 



·?0ƒ·
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
Daniel316



Registrado: 13 Ene 2008
Mensajes: 44
Ubicación: Argentina-Santa Fé-Arequito

MensajePublicado: 09/09/2010 5:24 pm
Título:

Hola cheroky
Me quedo con este código
Código:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char frase[100];

   printf("\n\t Ingrese una frase con espacios...:");
   scanf("%100[^\n]", frase);
   printf("\n\t Ingresaste.......................:%s \n\t",frase);

   return 0;
}

Funciona perfectamente y es lo mas conciso en sintaxis para lograr el cometido, solo una cosa mas, me podrías explicar como debo interpretar esta parte del enunciado:[^\n], el resto es sencillo.-


Un gran agradecimiento.-
Daniel
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7074
Ubicación: Mexico

MensajePublicado: 09/09/2010 5:45 pm
Título:

En tu programa no es necesario incluir el encabezado <stdlib.h>.

Cuando se utiliza scanf con el especificador de formato "%N[abc...]" esta almacena en la direccion indicada un maximo de "N" caracteres los cuales deben coincidir con alguno de los listados entre corchetes.

Por ejemplo "%[aeiou]" lee solo vocales.

A continuacion de los caracteres almacenados la funcion coloca el caracter '\0'. En tu programa es un error utilizar 100 como numero de caracteres ya que no habria espacio en el array (si se lee el maximo) para almacenar el '\0'.

Cuando el primer caracter inmediatamente despues de '[' es '^' como sucede con el ejemplo de cheroky este indica que se deben leer caracteres que no coincidan con el conjunto indicado.

Mas ejemplos:

"%99[aeiou]" ==> maximo 99 caracteres (vocales)

"%10[0123456789]" ==> maximo 10 caracteres (digitos)

"%[^\n]" ==> caracteres diferentes al avance de linea

Ya por ultimo hay que tener cuidado al utilizar caracteres de espacio blanco (espacio, tabulador, etc.) en la cadena de formato de scanf ya que estos no se toman literalmente (salvo el caso que nos ocupa).

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Daniel316



Registrado: 13 Ene 2008
Mensajes: 44
Ubicación: Argentina-Santa Fé-Arequito

MensajePublicado: 09/09/2010 6:04 pm
Título:

Hola rir3760
Muy interesante la respuesta y gracias por marcarme los 2 errores.-

Saludos.
Daniel
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com