Autor
|
Tema: Evitar leer el salto de línea cuando leemos cadenas en C (Leído 22,767 veces)
|
etcheverrypablol
Desconectado
Mensajes: 37
¡Hoy mejor que ayer, mañana mejor que hoy!
|
Me da cosa hacer tantas preguntas en este foro, averiguo en Internet sobre el tema, pero no se me está haciendo fácil conseguir las respuetas. De ahí que consulto por aquí, encuentro que es un lugar muy activo donde hay personas que están interesados en ayudar y de esa forma aprenden también. Vuelvo con un tema de las más tontos, pero no le encuentro una solución. El problema se le debe presentar indudablemente a todo aquel que se incia en C. De hecho en este foro Littlehorse se encargó de hacer una lista de las cosas que no debemos hacer en C como novatos. El problema que se presenta cuando usamos el scanf y queremos leer varias cadenas de caracteres. Pongo el siguiente ejemplo que encontré en Internet: http://www.carlospes.com/curso_de_lenguaje_c/01_11_la_funcion_fflush.phpEJEMPLO: Si nosotros escribimos este código: #include <stdio.h> int main() { char a, b, c; printf( "Introduzca primer caracter: " ); printf( "Introduzca segundo caracter: " ); printf( "Introduzca tercer caracter: " ); printf( "Los valores son: %c, %c, %c ", a , b , c ); return 0; }
vamos a ver que nos muestra por pantalla esto: Introduzca primer caracter: f Introduzca segundo caracter: Introduzca tercer caracter: h Los valores son: f, , hVemos que por pantalla los mensajes no aparecen como queremos. En el ejemplo se comenta que una solución para que no ocurra eso es usando la función fflush. Dejando el código así: #include <stdio.h> int main() { char a, b, c; printf( "Introduzca primer caracter: " ); printf( "Introduzca segundo caracter: " ); printf( "Introduzca tercer caracter: " ); printf( "Los valores son: %c, %c, %c ", a , b , c ); return 0; }
Ahora bien, yo compile este programa en mi pc y no me funcionó. Me siguen apareciendo mal los mensajes. Alguno de ustedes que está en el tema, hace uso de la función fflush o qué hacen en este caso? Me debería haber funcionado la función fflush? Me gustaría hacer uso de otra función como lo es fgets, pero veo que tampoco consigo la solución. Estoy lidiando con la lectura del salto de línea.
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Si bien suele funcionar fflush en búferes de entrada, evita usarlo, pues no hay un comportamiento definido para este caso. fflush sirve para forzar y vaciar los búferes de salida.
La mejor opción es que leas una línea completa. Si tiene 1 solo caracter (a parte del salto de línea), habrás logrado tu caracter. Si se mete por teclado varios caractere, puedes descartar el resto e ignorarlos. Si se mete por teclado una cadena vacía ("\r\n" o "\n"), puedes volver a pedir la entrada.
Otra opción, es que coloques scanf(" %c", &c); (nótese el espacio antes del %c), para que scanf ignore caracteres en blanco antes del caracter a leer.
|
|
|
En línea
|
|
|
|
mester
Desconectado
Mensajes: 219
https://www.youtube.com/watch?v=IlY9C6pzxKc
|
Es la primera vez en la vida que veo que a un scanf le afecte el salto de línea. La verdad es que sólo me había pasado con fgets, y como solución fue esta: char cadena[20]; fgets(cadena , 20, stdin ); cadena [strlen(cadena ) - 1] = '\0';
De esta manera no se imprime el salto de línea.
|
|
|
En línea
|
Justicia es dar a cada uno lo que se merece
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Para vaciar el buffer del teclado después de un scanf puedes usar la siguiente línea de código
|
|
|
En línea
|
|
|
|
etcheverrypablol
Desconectado
Mensajes: 37
¡Hoy mejor que ayer, mañana mejor que hoy!
|
Hola ivancea96, definiticamente voy a evitar usarlo para estos casos. Leí sobre el scanf(" %c", &c) y una de las formas que encontré de solucionar el problema es colocando scanf( "%*c %c", &b ); dejando el código así: #include <stdio.h> int main(int argc, char const *argv[]) { char a,b,c; printf( "Introduzca primer caracter: " ); printf( "Introduzca segundo caracter: " ); printf( "Introduzca tercer caracter: " ); printf( "Los valores son: %c, %c, %c \n", a , b , c ); return 0; }
Lo que hacemos en la novena y onceaba línea es primero leer con "%*c" el caracter de salto de línea que quedó en el buffer de haber leído la entrada anterior del teclado (lo que queda al apretar Enter) y luego leemos el caracter ingresado. MAFUS, había leido también sobre tu método, es la primer forma que encontré para soluciónar el problema y funciona muy bien para este caso. El código quedó así: #include <stdio.h> int main() { char a, b, c; printf( "Introduzca primer caracter: " ); printf( "Introduzca segundo caracter: " ); printf( "Introduzca tercer caracter: " ); printf( "Los valores son: %c, %c, %c \n", a , b , c ); return 0; }
Aún no termino de entender como es que funciona getchar, ese while sin una sentencia o bloque de código a ejecutar me cayó muy raro jaja. Veo que en C hay muchísimas maneras para resolver un mismo problema! mester también había leído sobre lo que comentaste, en su momento usaré ese método. Muchas gracias nuevamente a todos. Saludos!
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
La función while en este caso lo que hace es ir tomando caracteres del buffer del teclado y a cada repetición no hace nada, que es lo que marca el punto y coma.
La instrucción se irá repitiendo hasta que recoja el carácter '\n' (lo habrá sacado del buffer) y según la condición, como el carácter devuelto por getchar() será igual a '\n' se va a parar la repetición del while y el programa continuará con el buffer de teclado vacío.
|
|
|
En línea
|
|
|
|
etcheverrypablol
Desconectado
Mensajes: 37
¡Hoy mejor que ayer, mañana mejor que hoy!
|
Perfecto, ahora entiendo cómo es que funciona. Creo que lo voy a usar bastante jaja.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Como evitar el salto de linea despues de READ
GNU/Linux
|
dato000
|
2
|
4,234
|
20 Junio 2012, 09:23 am
por snhd6
|
|
|
Problema con nextLine(), como evitar salto de linea
Java
|
razler
|
5
|
21,493
|
1 Septiembre 2011, 05:22 am
por razler
|
|
|
Evitar salto de linea
Programación C/C++
|
Posyo
|
1
|
3,521
|
17 Enero 2012, 22:21 pm
por El_Java
|
|
|
evitar salto de linea al crear archivo de texto
Programación Visual Basic
|
rapbyone
|
6
|
4,646
|
21 Noviembre 2014, 19:32 pm
por Miseryk
|
|
|
Leer salto de línea C++
Programación C/C++
|
JonaLamper
|
1
|
10,395
|
15 Agosto 2016, 21:25 pm
por class_OpenGL
|
|