elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  scanf no lee vacío desde teclado?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: scanf no lee vacío desde teclado?  (Leído 6,050 veces)
flacc


Desconectado Desconectado

Mensajes: 854


Ver Perfil WWW
scanf no lee vacío desde teclado?
« en: 30 Mayo 2012, 08:34 am »

Hola, estoy intruseando c otra vez, y se me ocurrió hacer que se ingresen números los cuales los iré guardando un array hasta que sin introducir nada solo se presione el enter en consola y se de por terminado el ingreso de valores. Mi problema es que si uso scanf la instrucción sigue repitiéndose hasta que escriba algo en la consola y le de enter, pero quiero hacerlo de la forma que mencioné anteriormente, mi otra opción es getch(), pero solo me lee un carácter nada mas.
No soy muy entendido en c, por lo que me gustaría saber de los mas entendidos si habrá alguna forma de que scanf tome un enter de consola sin escribir nada o alguna forma de que getch o getchar me sirvan para introducir números negativos o reales... no pido código por favor, solo alguna explicación o una aclaración si es que lo estoy haciendo mal ya que esto es bastante distinto a juguetear con python que es lo que acostumbrado... Saludos y gracias


En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: scanf no lee vacío desde teclado?
« Respuesta #1 en: 30 Mayo 2012, 09:51 am »

en un bucle while?

while(caracter != enter)
{
//obtener caracter y almacenarlo
}

podria ser con getch como decis, se detiene hasta que sea enter


En línea

Saberuneko


Desconectado Desconectado

Mensajes: 2.194



Ver Perfil WWW
Re: scanf no lee vacío desde teclado?
« Respuesta #2 en: 30 Mayo 2012, 12:34 pm »

Comprueba el tamaño del array de cadena, si es 1 (o 0, ahora no recuerdo bien), es que sólo tiene el retorno de carro, y por lo tanto, que terminaste.

Te quedaría tal que así:


Código
  1. scanf("%s", foo);
  2. while(strlen(foo) >= 1) /* el valor debería ser 1 o 0, comprueba cual es */
  3. {
  4. scanf("%s", foo);
  5. }

No lo he probado yo mismo, pero creo que debería funcionar.

He probado, no funciona.
Voy a revisarlo. *sigh!* Estoy oxidado. :-(

Un Saludo.
« Última modificación: 30 Mayo 2012, 14:13 pm por Saberuneko » En línea

TomaSs

Desconectado Desconectado

Mensajes: 101



Ver Perfil
Re: scanf no lee vacío desde teclado?
« Respuesta #3 en: 30 Mayo 2012, 14:03 pm »

Eso no hay forma de hacerlo, lo que si puedes hacer es leerlo en forma de cadena (carácter a carácter) y posteriormente pasarlo a entero, ya que al leer carácter a carácter si que puedes controlar la pulsación de enter únicamente.
Una vez leída esa cadena, ya sería cuestión de chequear si se han introducido caracteres inválidos, etc
A! y el tamaño que podría tener esa cadena sería de 7 caracteres (6 + mas el fin de cadena), teniendo en cuenta los límites de los enteros, que van de -32767 to 32767 (incluido el signo negativo)

EI: juntando mensajes.

Aquí te va un programilla que te he hecho para sacar los números (de tipo double), después ya sería pasarlos a un array, lo cual sería tarea muy facil, y además con el entero que devuelve la función "obtenerNumero()" podrás controlar muy bien si los números introducidos son correctos ;)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void leerCadena(char *, int);
  6. int obtenerEntero(char *, double *);
  7.  
  8. int main(){
  9. char cadena[7];
  10. double numero;
  11. int res;
  12.  
  13.        printf("\nIntroduce el numero: ");
  14. leerCadena(cadena, sizeof(cadena));
  15.  
  16. res = obtenerEntero(cadena, &numero);
  17.  
  18. printf("\nNumero introducido: %f <<%d>>\n\n", numero, res);
  19.  
  20. system("PAUSE");
  21. return(0);
  22. }
  23.  
  24. //Función que leerá una cadena por teclado
  25. //Recibirá por parámetros un puntero a char, el cual apuntará a la cadena a rellenar
  26. //y el tamaño máximo que tendrá la misma. Como resultado, la cadena apuntada por el puntero
  27. //contendrá la cadena de caracteres introducida por teclado.
  28. void leerCadena(char * cadena, int tamano){
  29.  
  30.    int i=0;
  31.  
  32.    char aux; //Variable temporal en la que se irá guardando cada caracter introducido
  33.  
  34. fflush(stdin);//--->Limpiamos buffer
  35.  
  36.    aux = getchar();//------->Hacemos lectura del primer caracter, por si el primer
  37.                         //caracter es el fin de linea (cadena vacía), para que
  38.                            //se compruebe en el siguiente while
  39.  
  40.    while(i<tamano-1 && aux!='\n'){//---->Lectura de la "cadena" caracter a caracter, para así poder ir comprobando cada uno de
  41.        cadena[i] = aux;             //los caracteres hasta que se encuentre un "retorno de carro" o se supere el limite
  42.        aux = getchar();             //de caracteres de la cadena menos 1 (menos uno para reservar el último para el fin de cadena)
  43.        i++;
  44. }
  45.    cadena[i] = '\0';//--->Agregamos el fin de cadena al final de nuestro vector de caracteres
  46. }
  47.  
  48. //Función que transformará una cadena de caracteres en un entero (en caso de ser posible).
  49. //Recibirá por parámetros un puntero a char, el cual apuntará a la cadena a transformar
  50. //y un puntero a entero, el cual apuntará al entero en el que se guardará el entero (buscado)
  51. //una vez transformada la cadena. Los parámetros de salida de la función serán 1 en caso
  52. //de que el número sea correcto, -1 en caso de que la cadena de caracteres contenga algún
  53. //caracter inválido (que no corresponda a entero), o 0 en caso de que sea vacío el entero.
  54. int obtenerEntero(char * cadena, double * numero){
  55.  
  56. int tamano = 0; //Variable en la que se almacenará el tamaño de la cadena
  57. int numPunt = 0; //Variable que contendrá el número de puntos (decimales) encontrados
  58. char aux; //Variable temporal en la que se irá guardando cada caracter de la cadena
  59. int res; //Variable que retornará la función
  60.  
  61. aux = cadena[tamano];//-->Comprobamos el primer caracter, por si el primer
  62.                         //caracter es el fin de linea (cadena vacía), para que
  63.                            //se compruebe en el siguiente while
  64.  
  65. //Recorrido de la cadena hasta que encuentre el final de cadena, o encuentre un
  66. //caracter no permitido (distinto de un dígito o de .), o hasta que lea más de
  67. //dos puntos (..), lo cual se considerará también cadena erronea.
  68. while(aux != '\0' && (aux>=48 && aux<=57 || aux==46) && numPunt<=1){
  69. if(aux==46){
  70. numPunt++;
  71. }
  72. tamano++;
  73. aux = cadena[tamano];
  74. }
  75.  
  76. if(tamano == 0){//Si el tamaño es 0 la cadena está vacia (devuelve 0)
  77.  
  78. numero = '\0';
  79. res = 0;
  80. }else if(aux != '\0'){//Si no ha llegado al final, la cadena es erronea (devuelve -1)
  81.  
  82. numero = '\0';
  83. res = -1;
  84. }else{//En cualquier otro caso el número será válido (devuelve 1) y en el contenido
  85.  //del double apuntado por el puntero "numero" se introducirá la cadena
  86.  //transformada a double con atof()
  87. *numero = atof(cadena);
  88. res = 1;
  89. }
  90.  
  91. return(res);
  92. }
  93.  
« Última modificación: 30 Mayo 2012, 16:41 pm por TomaSs » En línea

flacc


Desconectado Desconectado

Mensajes: 854


Ver Perfil WWW
Re: scanf no lee vacío desde teclado?
« Respuesta #4 en: 31 Mayo 2012, 04:15 am »

Agradezco la ayuda a pesar de que no pedí código, después que escribir el mensaje, se me ocurrió dejar que el usuario introduzca números hasta que se le de la gana con getchar(), los convierto a números, y cada vez que encuentre un - lo que siga a la derecha será el entero, pero encuentro un problema para diferenciar números porque si el usuario ingresa -1, 400 y 3 mi vector imaginariamente se vería como -14003 lo que me impediría diferenciar que es que. Lo otro que estaba pensando que es un poco confuso, es hacer una lectura con scanf del teclado pasando todos los caracteres por medio de getchar(), y mientras sea distinto de "\0" mantener abierto el ingreso. Aunque no lo he probado por falta de tiempo ya le haré encajar a scanf un enter  :xD...saludos

No funciona :(... paso a manosear el código de TomaSs...
« Última modificación: 31 Mayo 2012, 04:19 am por Mini_Nauta » En línea

theluigy13etv

Desconectado Desconectado

Mensajes: 179


Primero se hace, después se mejora


Ver Perfil
Re: scanf no lee vacío desde teclado?
« Respuesta #5 en: 7 Septiembre 2012, 20:53 pm »

Puedes realizar la entrada desde un archivo de texto que contenga los números que deseas introducir

En la consola ejecutas el programa y le pasas el archivo de texto con la entrada:

.... programa.exe < entrada.txt

Y el programa debe de tener en su código fuente un bucle más o menos así:

while(scanf("%d", &num) !=EOF) {

}
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: scanf no lee vacío desde teclado?
« Respuesta #6 en: 8 Septiembre 2012, 05:56 am »

hola, aunque no pidieras el codigo estaba aburrido y he hecho mi version de lo que pides:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define N 8
  6.  
  7. int main() {
  8.  
  9. char bufer[N];
  10. int *arreglo=NULL, i=0, tNum=0;
  11.  
  12. printf("\n");
  13. while (bufer[0]!='\n') {
  14.  
  15. arreglo=(int*)realloc(arreglo, sizeof(arreglo)+sizeof(int));
  16. printf("Numero: ");
  17. fgets(bufer, N-1, stdin);
  18.  
  19. if (bufer[0]!='\n') {
  20. bufer[strlen(bufer)-1]='\0';
  21. arreglo[i++]=atoi(bufer);
  22. tNum++;
  23. memset(bufer, '\0', sizeof(bufer));
  24. }
  25. }
  26.  
  27. printf("\nNumeros totales: %d\nArreglo: ", tNum);
  28. for (i=0; i<tNum; i++)
  29. printf("%d ", arreglo[i]);
  30. printf("\n");
  31.  
  32. free(arreglo);
  33. return 0;
  34. }

Código:
~$ gcc enteros.c -o enteros
~$ ./enteros

Numero: 12
Numero: 32
Numero: 4
Numero: 56
Numero: 65
Numero:

Numeros totales: 5
Arreglo: 12 32 4 56 65

espero que te sirva de ayuda y un saludo!
« Última modificación: 8 Septiembre 2012, 05:58 am por xiruko » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: scanf no lee vacío desde teclado?
« Respuesta #7 en: 8 Septiembre 2012, 14:09 pm »

Sales con CTRL+Z Enter. NO es exactamente como pedías, pero menos da una piedra ;D ;D:
Código:
#include <stdio.h>
int main( void )
{
    int c, i, n=0;
    int digitos[100];
    int num;
    printf( "Escribe un numero (100 como maximo): \n" );
    while(scanf("%d", &digitos[n]) !=EOF) {
    n++;
}
    printf( "Numeros introducidos: " );
    for( i = 0; i < n; ++i )
      printf( "%d,", digitos[i] );
    printf( "\b ");
    return 0;
}
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Bloquear el teclado desde Visual Basic
Programación Visual Basic
TheWarrior 7 8,944 Último mensaje 22 Enero 2007, 18:02 pm
por ~~
Flujo de entrada desde el teclado. Sugerencia?
Java
evas1on 3 4,757 Último mensaje 14 Mayo 2009, 17:30 pm
por -Ramc-
problemas con teclado desde mi vmware
GNU/Linux
Mr.Blue 0 3,326 Último mensaje 9 Junio 2010, 04:11 am
por Mr.Blue
Sacar con scanf() todo el contenido del buffer del teclado.- « 1 2 »
Programación C/C++
DanielC 10 7,642 Último mensaje 9 Septiembre 2010, 01:33 am
por leogtz
Bloquear teclado desde VB?
Programación Visual Basic
Sanlegas 8 13,440 Último mensaje 9 Mayo 2011, 22:19 pm
por Miseryk
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines