scanf no lee vacío desde teclado?

Iniciado por flacc, 30 Mayo 2012, 08:34 AM

0 Miembros y 1 Visitante están viendo este tema.

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

x64core

en un bucle while?

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

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

Saberuneko

#2
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í:


scanf("%s", foo);
while(strlen(foo) >= 1) /* el valor debería ser 1 o 0, comprueba cual es */
{
scanf("%s", foo);
}


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

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

Un Saludo.

TomaSs

#3
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);

system("PAUSE");
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()
*numero = atof(cadena);
res = 1;
}

return(res);
}

flacc

#4
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...

theluigy13etv

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) {

}

xiruko

#6
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;

printf("\n");
while (bufer[0]!='\n') {

arreglo=(int*)realloc(arreglo, sizeof(arreglo)+sizeof(int));
printf("Numero: ");
fgets(bufer, N-1, stdin);

if (bufer[0]!='\n') {
bufer[strlen(bufer)-1]='\0';
arreglo[i++]=atoi(bufer);
tNum++;
memset(bufer, '\0', sizeof(bufer));
}
}

printf("\nNumeros totales: %d\nArreglo: ", tNum);
for (i=0; i<tNum; i++)
printf("%d ", arreglo[i]);
printf("\n");

free(arreglo);
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!

leosansan

Sales con CTRL+Z Enter. NO es exactamente como pedías, pero menos da una piedra ;D ;D:
#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;
}