| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Daniel316
Registrado: 13 Ene 2008 Mensajes: 44 Ubicación: Argentina-Santa Fé-Arequito
| Publicado: 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)
| Publicado: 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
| Publicado: 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)
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |
 |
|
|