Validar ingreso de cadena y de números en lenguaje C.

Iniciado por NOB2014, 16 Febrero 2016, 22:59 PM

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

NOB2014

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);
if((p=strchr(cadena, '\n'))){
*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'){
if(isdigit(c)){
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 
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);
Un byte a la izquierda.

NOB2014

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(isdigit(c)){
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
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

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 (cpp) [Seleccionar]
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.

engel lex

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

Código (cpp) [Seleccionar]
if( UINT_MAX-numero*10 >= c-48 )

así aún puedes medir eso sin desbordar
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

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

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

#7
Los warnings son por no hacer los castings convenientes.

Concretamente en la linea  10 y la 20, como te indica el compilador.

saludos.
Un byte a la izquierda.