C/Visual C - De char a int sin strtol() a mano

 
Vista:

De char a int sin strtol() a mano

Publicado por DanielC (3 intervenciones) el 18/10/2010 19:38:48
Hola a todos
El programa que estoy haciendo intenta pasar de char a int sin utilizar las funciones ya creadas.-
Lo que tengo que validar creo que son 2 cosas.-
s205 No es entero
205s No es entero
20s5 No es entero
Y que el ingreso x teclado no supere el máximo soportado por el tipo int, lo anterior lo dejo para después, lo que necesito es validar que no halla desbordamiento, para ello en cada iteración del bucle sumar enteroFinal + enteroAuxiliar y alojarlo en una variable superior en capacidad a int para que si se pasa del máximo que establece la librería limits.h informar que el ingreso supera el máximo permitido para dicha variable.-

#include <stdio.h>
#include <stdlib.h>

#define men printf("\n Apriete cualquier tecla para cerrar la ventana...");system("pause>null");

int main (void)
{
char temp[11];
int i = 0,enteroAuxiliar = 0,enteroFinal=0;
printf("\n Ingrese un entero:");
fgets(temp, 10, stdin);

for(i=0;i<6;i++)
{
if(temp[i] > 47 && temp[i] < 59)
{
enteroAuxiliar = temp[i] - 48;
enteroFinal=10*enteroFinal+enteroAuxiliar;
}
}
printf("\n Ingreso el entero:%i" ,enteroFinal);
men;
return 0;
}
¿Me podrian decir como puedo hacer esto?
Saludos.
Daniel
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:De char a int sin strtol() a mano

Publicado por pepe (32 intervenciones) el 20/10/2010 15:10:43
Este ejercicio tiene cierta complejidad.

Para mi gusto, la mejor manera de obtener una entrada de datos del usuario, y sobre todo si queremos diferenciar números de letras, se debería evitar funciones como fgets, y utilizar las funciones de tipo getch que obtienen los caracteres uno a uno, para controlar con más precisión las teclas pulsadas.

Pero quizás en este caso sea obligatorio utilizar fgets, puede ser parte del ejercicio para comprobar los casos en los que se introducen otros caracteres como s205, asi que no entraremos en modificar la estructura del programa, que en mi opinión necesitaría otro enfoque.

Siguiendo con el código expuesto, enteroAuxiliar y enteroFinal deberían definirse como tipo long (entero largo) para almacenar números mayores que Int. Recordemos los rangos de los tipos:

entero (int) -32768 a +32767
entero sin signo (unsigned int) +0 a +65535
entero largo (long) -2147483648 a +2147483647
entero largo sin signo (unsigned long) +0 a +4294967295

Esto es válido para compiladores de 16 bits, para los de 32 un entero sería de 32 Bits equivalente a long de 16. Es importante determinar esto para poder saber en que valores nos movemos.

Puedo suponer que si usamos un array de 10 caracteres para almacenar el valor entero podemos estar hablando de compilador de 32bits con enteros de 32bits, con lo que deberemos encontrar el tipo de dato para un entero de 64bits.

Una vez conseguido esto, simplemente tendremos que poner un if del tipo

if( enteroFinal>-2147483649 && enteroFinal<2147483648)
{
printf("\n Ingreso el entero:%i" ,enteroFinal);
}

Espero habler explicado con claridad los conceptos. Es MUY importante conocer los tipos de datos y sus rangos de valores para poder programar bien en un lenguaje, sobre todo si se trata de C++.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:De char a int sin strtol() a mano

Publicado por DanielC (3 intervenciones) el 22/10/2010 18:47:31
Hola pepe
El programa lo termine y me funciona perfectamente voy a intentar uno nuevo con getch,
para notar las ventajas sobre fgets muchas gracia x tu el tiempo.-

Saludos.
Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar