Autor
|
Tema: Validar ingreso de cadena y de números en lenguaje C. (Leído 10,551 veces)
|
NOB2014
Desconectado
Mensajes: 366
|
Hola a todos. Estoy haciendo algunas practicas para hacer que el ingreso de datos en c no traiga sorpresas, En cuanto a las cadenas me parece que con el primer programa está todo resuelto, no debería haber errores (me refiero a no escribir más aya del límite de la variable).- El inconveniente lo tengo con el ingreso de números, no logro validar que el número ingresado sea menor o igual a UINT_MAX, pensé en crear una variable con mayor capacidad y así no tendría sorpresas, pero lo que quisiera saber si hay alguna otra manera,- #include<stdio.h> #include<string.h> #define MAX_CARACTERES 9 int main(void){ char cadena[MAX_CARACTERES]={'\0'}, *p=NULL; unsigned int ch=0; printf("\n\n ----- Programa que muestra el comportamiento de fgets -----"); printf("\n\n Ingrese una frase (maximo %d caracteres)....:", MAX_CARACTERES - 1); fgets(cadena , MAX_CARACTERES , stdin ); *p='\0'; } else{ while((ch = getchar()) !='\n' && ch !=EOF ); } printf("\n Ingreso.............:%s", cadena ); return 0; }
#include <stdio.h> #include <ctype.h> #include <limits.h> int main(void){ unsigned int numero = 0, c; printf("\n\n Ingrese una numero entero (maximo permitido %u)....:", UINT_MAX ); while((c = getchar()) != '\n' && c != '\r'){ numero *= 10; numero += c-48; } else{ printf( "\n Ingreso invalido..." ); numero = 0; break; } } printf("\n Ingreso.............:%u", numero ); return 0; }
Otra cosita, alguien me podría decir como poner estas 2 líneas en una sola, le puse paréntesis, pero de cualquier manera el resultado es erróneo,- numero *= 10; numero += c-48;
Bueno es todo, espero puedan ayudarme.- Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
fary
|
Que problema tienes con los numeros? tu duda se resuelte con un simple if... Lo de la cosilla: numero = (numero*10) + (c-48);
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
Hola, fary. Muchas gracias por ocuparte, a continuación pongo unas líneas para que veas como lo hice, si esto es lo que proponías en mi caso no me funciona, o sea, no valida correctamente, si pongo if( (numero*10) + (c-48) <= 1000 ) e ingreso 1001 me valida correctamente pero con UINT_MAX no me funciona, probé con un #define y tampoco. - ....................... while((c = getchar()) != '\n' && c != '\r'){ if( (numero*10) + (c-48) <= UINT_MAX ) numero = (numero*10) + (c-48); else{ printf( "\n El numero ingresado supera el maximo permitido..." ); numero = 0; break;} } else{ printf( "\n Ingreso invalido..." ); numero = 0; break; } } .....................
Espero que me indiques(n) donde se encuentra el error,- Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Sea cual sea el error, ten en cuenta una cosa. ¿Qué número entero sin signo podria ser mayor que el máximo número entro sin signo? if( (numero*10) + (c-48) <= UINT_MAX )
Ninguno. Deberías hacer un casting a long long al menos (o declarar numero como long long). Y como dato extra, en vez de 48, puedes poner '0', por pura claridad a la hora de trabajar.
|
|
|
En línea
|
|
|
|
engel lex
|
también se podría (a riesgo que el numero no sea ridículamente grande) if( UINT_MAX-numero*10 >= c-48 )
así aún puedes medir eso sin desbordar
|
|
« Última modificación: 17 Febrero 2016, 16:19 pm por engel lex »
|
En línea
|
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
Hola. - declarando numero como long long como sugirió ivancea96 funciona a la perfección. - No obstante me quedan dudas, voy a seguir practicando. -
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
Hola, a todos. Conseguí hacer otra versión para que el ingreso de números sea correcto, espero que le sirva de ayuda a alguien. - #include <stdio.h> #include <limits.h> int main( void ){ long long int numero = 0; int ch, ok, con = 0; do{ printf("\n Ingresa un numero entero(maximo %u)....: ", UINT_MAX ); ok = scanf("%lld", &numero ) == 1 && numero >= 1 && numero <= UINT_MAX ; while ((ch = getchar()) != EOF && ch != '\n'){ con++; }; if( con > 0 ){ ok = 0; con = 0; } }while(!ok); printf( "\n Ingreso...: %lld", numero ); return 0; }
Aprovecho para consultarles si alguien sabe por qué me da los siguientes errores al compilar, consulté en internet y está todo explicado en inglés y todavía no es mi fuerte, debo aclarar que en la máquina que compilo en línea de comando (imagen) me da las advertencias, en cambio, en la otra de 64 bits, en Linux con el compilador que trae integrado el ide Geany, todo correcto. - Creo tener la última versión del compilador gcc, tal vez esté mal configurado.- Saludos.
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
fary
|
Los warnings son por no hacer los castings convenientes.
Concretamente en la linea 10 y la 20, como te indica el compilador.
saludos.
|
|
« Última modificación: 18 Febrero 2016, 23:09 pm por fary »
|
En línea
|
Un byte a la izquierda.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Validar ingreso en bat
Scripting
|
dj kuzmar
|
1
|
4,031
|
3 Febrero 2010, 01:03 am
por leogtz
|
|
|
Validar ingreso correcto con mensaje en consola...
.NET (C#, VB.NET, ASP)
|
DanielPy
|
3
|
3,823
|
13 Mayo 2013, 19:37 pm
por DanielPy
|
|
|
Validar ingreso de datos en C Sharp
.NET (C#, VB.NET, ASP)
|
DanielPy
|
3
|
3,255
|
14 Julio 2013, 04:04 am
por DanielPy
|
|
|
validar numeros
Programación C/C++
|
m@o_614
|
1
|
2,669
|
5 Abril 2014, 02:54 am
por do-while
|
|
|
Validar ingreso de datos con Python
Scripting
|
NOB2014
|
6
|
8,514
|
18 Octubre 2017, 18:01 pm
por NOB2014
|
|