Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 16 Febrero 2016, 22:59 pm



Título: Validar ingreso de cadena y de números en lenguaje C.
Publicado por: NOB2014 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 


Título: Re: Validar ingreso de cadena y de números en lenguaje C.
Publicado por: fary 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);


Título: Re: Validar ingreso de cadena y de números en lenguaje C.
Publicado por: NOB2014 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


Título: Re: Validar ingreso de cadena y de números en lenguaje C.
Publicado por: ivancea96 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.


Título: Re: Validar ingreso de cadena y de números en lenguaje C.
Publicado por: engel lex 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


Título: Re: Validar ingreso de cadena y de números en lenguaje C.
Publicado por: NOB2014 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


Título: Re: Validar ingreso de cadena y de números en lenguaje C.
Publicado por: NOB2014 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. -     

(http://i67.tinypic.com/5ldvfq.png)

Creo tener la última versión del compilador gcc, tal vez esté mal configurado.-

Saludos.


Título: Re: Validar ingreso de cadena y de números en lenguaje C.
Publicado por: fary 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.