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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Validar ingreso de cadena y de números en lenguaje C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Validar ingreso de cadena y de números en lenguaje C.  (Leído 7,985 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Validar ingreso de cadena y de números en lenguaje C.
« en: 16 Febrero 2016, 22:59 pm »

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,-

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. #define MAX_CARACTERES 9
  5.  
  6. int main(void){
  7. char cadena[MAX_CARACTERES]={'\0'}, *p=NULL;
  8. unsigned int ch=0;
  9.  
  10. printf("\n\n ----- Programa que muestra el comportamiento de fgets -----");
  11. printf("\n\n Ingrese una frase (maximo %d caracteres)....:", MAX_CARACTERES - 1);
  12. fgets(cadena, MAX_CARACTERES, stdin);
  13. if((p=strchr(cadena, '\n'))){
  14. *p='\0';
  15. }
  16. else{
  17. while((ch = getchar()) !='\n' && ch!=EOF);
  18. }
  19. printf("\n  Ingreso.............:%s", cadena);
  20. return 0;
  21. }


Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <limits.h>
  4.  
  5. int main(void){
  6. unsigned int numero = 0, c;
  7.  
  8. printf("\n\n Ingrese una numero entero (maximo permitido %u)....:", UINT_MAX);
  9.  
  10. while((c = getchar()) != '\n' && c != '\r'){
  11. if(isdigit(c)){
  12. numero *= 10;
  13. numero += c-48;
  14. }
  15. else{
  16. printf( "\n Ingreso invalido..." );
  17. numero = 0;
  18. break;
  19. }
  20. }
  21.  
  22. printf("\n Ingreso.............:%u", numero);
  23. return 0;
  24. }



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,-

Código
  1. numero *= 10;
  2. numero += c-48;
  3.  

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
Moderador Global
***
Desconectado Desconectado

Mensajes: 1.020



Ver Perfil WWW
Re: Validar ingreso de cadena y de números en lenguaje C.
« Respuesta #1 en: 17 Febrero 2016, 00:49 am »

Que problema tienes con los numeros? tu duda se resuelte con un simple if...

Lo de la cosilla:

Código
  1. numero = (numero*10) + (c-48);


En línea

Un byte a la izquierda.
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Validar ingreso de cadena y de números en lenguaje C.
« Respuesta #2 en: 17 Febrero 2016, 13:44 pm »

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

Código
  1. .......................
  2. while((c = getchar()) != '\n' && c != '\r'){
  3. if(isdigit(c)){
  4. if( (numero*10) + (c-48) <= UINT_MAX )
  5. numero = (numero*10) + (c-48);
  6. else{
  7. printf( "\n El numero ingresado supera el maximo permitido..." );
  8. numero = 0;
  9. break;}
  10. }
  11. else{
  12. printf( "\n Ingreso invalido..." );
  13. numero = 0;
  14. break;
  15. }
  16. }
  17. .....................
  18.  
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 Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: Validar ingreso de cadena y de números en lenguaje C.
« Respuesta #3 en: 17 Febrero 2016, 16:03 pm »

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?

Código
  1. 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
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Validar ingreso de cadena y de números en lenguaje C.
« Respuesta #4 en: 17 Febrero 2016, 16:18 pm »

también se  podría (a riesgo que el numero no sea ridículamente grande)

Código
  1. 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 Desconectado

Mensajes: 366



Ver Perfil
Re: Validar ingreso de cadena y de números en lenguaje C.
« Respuesta #5 en: 17 Febrero 2016, 21:40 pm »

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 Desconectado

Mensajes: 366



Ver Perfil
Re: Validar ingreso de cadena y de números en lenguaje C.
« Respuesta #6 en: 18 Febrero 2016, 22:40 pm »

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

Código
  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. int main( void ){
  5. long long int numero = 0;
  6. int ch, ok, con = 0;
  7.  
  8. do{
  9. printf("\n Ingresa un numero entero(maximo %u)....: ", UINT_MAX);
  10. ok = scanf("%lld", &numero) == 1 && numero >= 1 && numero <= UINT_MAX;
  11. while ((ch = getchar()) != EOF && ch != '\n'){
  12. con++;
  13. };
  14. if( con > 0 ){
  15. ok = 0;
  16. con = 0;
  17. }
  18. }while(!ok);
  19.  
  20. printf( "\n Ingreso...: %lld", numero );
  21.  
  22. return 0;
  23. }


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
Moderador Global
***
Desconectado Desconectado

Mensajes: 1.020



Ver Perfil WWW
Re: Validar ingreso de cadena y de números en lenguaje C.
« Respuesta #7 en: 18 Febrero 2016, 23:08 pm »

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.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Validar ingreso en bat
Scripting
dj kuzmar 1 3,016 Último mensaje 3 Febrero 2010, 01:03 am
por leogtz
Validar ingreso correcto con mensaje en consola...
.NET (C#, VB.NET, ASP)
DanielPy 3 2,534 Último mensaje 13 Mayo 2013, 19:37 pm
por DanielPy
Validar ingreso de datos en C Sharp
.NET (C#, VB.NET, ASP)
DanielPy 3 2,139 Último mensaje 14 Julio 2013, 04:04 am
por DanielPy
validar numeros
Programación C/C++
m@o_614 1 1,800 Último mensaje 5 Abril 2014, 02:54 am
por do-while
Validar ingreso de datos con Python
Scripting
NOB2014 6 6,402 Último mensaje 18 Octubre 2017, 18:01 pm
por NOB2014
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines