Autor
|
Tema: scanf no lee vacío desde teclado? (Leído 6,035 veces)
|
flacc
|
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
Mensajes: 1.908
|
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
|
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í:while(strlen(foo ) >= 1) /* el valor debería ser 1 o 0, comprueba cual es */ { }
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
Mensajes: 101
|
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 #include <stdio.h> #include <stdlib.h> #include <string.h> void leerCadena(char *, int); int obtenerEntero(char *, double *); int main(){ char cadena[7]; double numero; int res; printf("\nIntroduce el numero: "); leerCadena(cadena, sizeof(cadena)); res = obtenerEntero(cadena, &numero); printf("\nNumero introducido: %f <<%d>>\n\n", numero , res ); return(0); } //Función que leerá una cadena por teclado //Recibirá por parámetros un puntero a char, el cual apuntará a la cadena a rellenar //y el tamaño máximo que tendrá la misma. Como resultado, la cadena apuntada por el puntero //contendrá la cadena de caracteres introducida por teclado. void leerCadena(char * cadena, int tamano){ int i=0; char aux; //Variable temporal en la que se irá guardando cada caracter introducido fflush(stdin );//--->Limpiamos buffer aux = getchar();//------->Hacemos lectura del primer caracter, por si el primer //caracter es el fin de linea (cadena vacía), para que //se compruebe en el siguiente while while(i<tamano-1 && aux!='\n'){//---->Lectura de la "cadena" caracter a caracter, para así poder ir comprobando cada uno de cadena[i] = aux; //los caracteres hasta que se encuentre un "retorno de carro" o se supere el limite aux = getchar(); //de caracteres de la cadena menos 1 (menos uno para reservar el último para el fin de cadena) i++; } cadena[i] = '\0';//--->Agregamos el fin de cadena al final de nuestro vector de caracteres } //Función que transformará una cadena de caracteres en un entero (en caso de ser posible). //Recibirá por parámetros un puntero a char, el cual apuntará a la cadena a transformar //y un puntero a entero, el cual apuntará al entero en el que se guardará el entero (buscado) //una vez transformada la cadena. Los parámetros de salida de la función serán 1 en caso //de que el número sea correcto, -1 en caso de que la cadena de caracteres contenga algún //caracter inválido (que no corresponda a entero), o 0 en caso de que sea vacío el entero. int obtenerEntero(char * cadena, double * numero){ int tamano = 0; //Variable en la que se almacenará el tamaño de la cadena int numPunt = 0; //Variable que contendrá el número de puntos (decimales) encontrados char aux; //Variable temporal en la que se irá guardando cada caracter de la cadena int res; //Variable que retornará la función aux = cadena[tamano];//-->Comprobamos el primer caracter, por si el primer //caracter es el fin de linea (cadena vacía), para que //se compruebe en el siguiente while //Recorrido de la cadena hasta que encuentre el final de cadena, o encuentre un //caracter no permitido (distinto de un dígito o de .), o hasta que lea más de //dos puntos (..), lo cual se considerará también cadena erronea. while(aux != '\0' && (aux>=48 && aux<=57 || aux==46) && numPunt<=1){ if(aux==46){ numPunt++; } tamano++; aux = cadena[tamano]; } if(tamano == 0){//Si el tamaño es 0 la cadena está vacia (devuelve 0) numero = '\0'; res = 0; }else if(aux != '\0'){//Si no ha llegado al final, la cadena es erronea (devuelve -1) numero = '\0'; res = -1; }else{//En cualquier otro caso el número será válido (devuelve 1) y en el contenido //del double apuntado por el puntero "numero" se introducirá la cadena //transformada a double con atof() res = 1; } return(res); }
|
|
« Última modificación: 30 Mayo 2012, 16:41 pm por TomaSs »
|
En línea
|
|
|
|
flacc
|
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 ...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
Mensajes: 179
Primero se hace, después se mejora
|
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
Mensajes: 438
|
hola, aunque no pidieras el codigo estaba aburrido y he hecho mi version de lo que pides: #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 8 int main() { char bufer[N]; int *arreglo=NULL, i=0, tNum=0; while (bufer[0]!='\n') { arreglo =(int*)realloc(arreglo , sizeof(arreglo )+sizeof(int)); fgets(bufer , N -1, stdin ); if (bufer[0]!='\n') { arreglo [i ++]=atoi(bufer ); tNum++; memset(bufer , '\0', sizeof(bufer )); } } printf("\nNumeros totales: %d\nArreglo: ", tNum ); for (i=0; i<tNum; i++) return 0; }
~$ 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
Mensajes: 1.314
|
Sales con CTRL+Z Enter. NO es exactamente como pedías, pero menos da una piedra : #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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Bloquear el teclado desde Visual Basic
Programación Visual Basic
|
TheWarrior
|
7
|
8,909
|
22 Enero 2007, 18:02 pm
por ~~
|
|
|
Flujo de entrada desde el teclado. Sugerencia?
Java
|
evas1on
|
3
|
4,755
|
14 Mayo 2009, 17:30 pm
por -Ramc-
|
|
|
problemas con teclado desde mi vmware
GNU/Linux
|
Mr.Blue
|
0
|
3,323
|
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,634
|
9 Septiembre 2010, 01:33 am
por leogtz
|
|
|
Bloquear teclado desde VB?
Programación Visual Basic
|
Sanlegas
|
8
|
13,414
|
9 Mayo 2011, 22:19 pm
por Miseryk
|
|