Ver Mensaje Individual
  #6 (permalink)  
Antiguo 25/06/2015, 22:42
tabam
 
Fecha de Ingreso: octubre-2010
Ubicación: Uruguay
Mensajes: 23
Antigüedad: 14 años, 1 mes
Puntos: 1
Respuesta: Convertir caracter a entero

Cita:
Iniciado por eferion Ver Mensaje
Debe ser algún problema de tu compilador. Dev-C++ es un IDE desfasado, sin mantenimiento desde hace años y con un compilador antiguo.

Es importante tener herramientas que se mantengan actualizadas para evitar errores tontos. En tu caso podrías probar a usar code::blocks. Es un IDE bastante más completo que Dev y además tiene una comunidad activa por detrás que lo va manteniendo... creo que para Windows ofrece dos instaladores (sin compilador y con minGw), yo me descargaría la opción con compilador. De esta forma tienes todo el paquete listo para desarrollar.



Ahí únicamente te está mostrando una advertencia, y ésta te avisa que estás realizando una conversión de tipo double (decimal) a tipo int (sin decimales). Esta advertencia sale porque cada tipo de datos tiene su propio rango de valores (el rango de double es muchísimo mayor que el de int) y la conversión puede dar lugar a la pérdida de información.

En memoria las cadenas de caracteres se almacenan alineando los caracteres uno detrás de otro en posiciones consecutivas de memoria. En PHP, que es un lenguaje orientado a objetos, se hace uso de una clase string que encapsula este comportamiento, por lo que este detalle para tí pasa desapercibido. En C, en cambio, no hay clases, por lo que el acceso hay que realizarlo, a pelo. En este caso lo que obtienes es un puntero, que no es más que una variable con una particularidad: en vez de almacenar un valor, almacena una posición de memoria. El puntero en este caso apunta a la posición de memoria donde empieza la cadena de caracteres, por lo que recorrer la cadena de caraceres es tan sencillo como incrementar el valor almacenado en el puntero (que es una dirección de memoria).

En cualquier caso se puede conseguir un código más sencillo para realizar la tarea que necesitas:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. // argc indica el número de argumentos almacenados en argv
  4. // el valor mínimo de argc es 1, ya que el primer argumento es SIEMPRE el nombre del ejecutable
  5. // argv es una tabla de strings
  6. main (int argc, char *argv[])
  7. {
  8.   if(argc == 2)
  9.   {
  10.     int num = 0;
  11.  
  12.     // creamos una nueva variable, ptr, que apunta al inicio del número a convertir
  13.     char* ptr = argv[1];
  14.  
  15.     // Las cadenas de caracteres en C terminan SIEMPRE con un caracter nulo '\0'
  16.     // Si 'ptr' almacena una posición de memoria, '*ptr' permite recuperar el valor
  17.     // almacenado en dicha posición de memoria.
  18.     // Por otro lado, 'if(*ptr)' es equivalente a 'if(*ptr!=0)'
  19.     // El bucle for, como en PHP, tiene tres partes:
  20.     //   - inicialización de variables (que no lo necesitamos, por eso está en blanco)
  21.     //   - condición para salir del bucle (llegar al final de la cadena)
  22.     //   - actualización de variables en cada iteración (avanzamos un caracter)
  23.     // En resumen: este bucle itera sobre una cadena hasta que llega al final de la misma.
  24.     for( ; *ptr; ++ptr)
  25.     {
  26.       // Multiplicamos el número acumulado hasta ahora por 10 para hacer sitio
  27.       // al nuevo dígito
  28.       num *= 10;
  29.  
  30.       // '0'=0x30 y a partir de ahí siguen el resto de dígitos, así, por ejemplo:
  31.       // '8'-'0'=0x38-0x30=0x08=8.
  32.       // Queda claro entonces que esta línea convierte un carácter en un dígito numérico
  33.       num += *ptr - '0';
  34.     }
  35.  
  36.     printf("<br>%i",num);
  37.   }
  38.   else
  39.   {
  40.     printf("Error: argumentos no validos\n");
  41.     return 1;
  42.   }
  43.  
  44.   return 0;
  45. }

Un saludo
Hola, gracias por el codigo, mucho mas entendible y simplificado que el que arme yo, además no me da los mensajes de advertencia y funcionan todos los números que le envío.

Voy a tener en cuenta el code::blocks ya que el Dev-C++ lo saque de un CD viejo que tenia y fue lo primero que agarre para hacer este programa en C.

Saludos!!!!!!