Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Convertir caracter a entero

Estas en el tema de Convertir caracter a entero en el foro de C/C++ en Foros del Web. Hola, lo que preciso que al enviarle un número al siguiente programa: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original #include <stdio.h>   main ( int argc ...
  #1 (permalink)  
Antiguo 24/06/2015, 00:30
 
Fecha de Ingreso: octubre-2010
Ubicación: Uruguay
Mensajes: 23
Antigüedad: 14 años, 1 mes
Puntos: 1
Pregunta Convertir caracter a entero

Hola, lo que preciso que al enviarle un número al siguiente programa:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. main(int argc, char *argv[]){
  4.  
  5.   char *mensaje;
  6.   mensaje = argv[1];
  7.  
  8.          printf("El mensaje es: %s",mensaje);
  9.  
  10. }

Dicho programa me guarde este numero en una variable tipo int y que este numero sea realmente un numero entero y no un carácter.

Espero que se halla entendido.

Saludos!!!!!
  #2 (permalink)  
Antiguo 24/06/2015, 00:48
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Convertir caracter a entero

Si hechas un vistazo a la tabla ASCII, verás que los caraceres 0x30 a 0x39 se corresponden con dígitos numéricos.

Lo que puedes hacer es recorrer la cadena y verificar que cada carácter de la misma se encuentre dentro de ese rango. Con un for y un if lo tienes hecho. También tienes funciones para saber si un carácter es numérico o no, pero desconozco el grado de libertad que tienes para usar este tipo de funciones.

Con lo anterior ya puedes verificar que el dato introducido sea un entero. Si ahora lo quieres convertir a un número, recorres la cadena y, para cada caracter, realizas la operación 'numero = numero * 10 + (caracter - 0x30)'. Básicamente lo que estás haciendo es calcular el valor numérico que se corresponde con el carácter actual ('1' o 0x31 debería devolver 1 porque 0x31-0x30=1). Por supuesto, esto funcionará si numero es de tipo int.

Un saludo.
  #3 (permalink)  
Antiguo 24/06/2015, 20:44
 
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
Si hechas un vistazo a la tabla ASCII, verás que los caraceres 0x30 a 0x39 se corresponden con dígitos numéricos.

Lo que puedes hacer es recorrer la cadena y verificar que cada carácter de la misma se encuentre dentro de ese rango. Con un for y un if lo tienes hecho. También tienes funciones para saber si un carácter es numérico o no, pero desconozco el grado de libertad que tienes para usar este tipo de funciones.

Con lo anterior ya puedes verificar que el dato introducido sea un entero. Si ahora lo quieres convertir a un número, recorres la cadena y, para cada caracter, realizas la operación 'numero = numero * 10 + (caracter - 0x30)'. Básicamente lo que estás haciendo es calcular el valor numérico que se corresponde con el carácter actual ('1' o 0x31 debería devolver 1 porque 0x31-0x30=1). Por supuesto, esto funcionará si numero es de tipo int.

Un saludo.

Hola, la verdad es que se muy poco de C, soy mas programador de PHP y lo que quiero es enviarle un numero de PHP a C por medio de esta función:

exec("archivo_C 2 ");

y que el programa en C envíe este número al puerto paralelo de la PC.

Lamentablemente no entiendo bien lo que me decís que tengo que hacer, aparte me confunde los punteros que utiliza C para obtener el parámetro que le estoy enviando desde PHP.

Si no es mucha molestia me podrías mostrar un ejemplo de cómo hacerlo, no digo que me hagas el trabajo pero precisaría un poco mas de ayuda.

Saludos!!!!!
  #4 (permalink)  
Antiguo 24/06/2015, 23:18
 
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 tabam Ver Mensaje
Hola, la verdad es que se muy poco de C, soy mas programador de PHP y lo que quiero es enviarle un numero de PHP a C por medio de esta función:

exec("archivo_C 2 ");

y que el programa en C envíe este número al puerto paralelo de la PC.

Lamentablemente no entiendo bien lo que me decís que tengo que hacer, aparte me confunde los punteros que utiliza C para obtener el parámetro que le estoy enviando desde PHP.

Si no es mucha molestia me podrías mostrar un ejemplo de cómo hacerlo, no digo que me hagas el trabajo pero precisaría un poco mas de ayuda.

Saludos!!!!!


Lo que logre hasta ahora en base a algunos ejemplos que vi en la web fue lo siguiente:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4.  
  5. main (int argc, char *argv[]){
  6.      
  7.      if(argc == 2){
  8.        
  9.         int num = 0;
  10.         int tam  = strlen(argv[1]);
  11.         int digito;
  12.         int i;
  13.  
  14.             for (i = tam ; i > 0; --i) {
  15.                 digito = (int) (argv[1][i - 1] - 48);
  16.                 num += digito * pow(10.0, tam - i);
  17.             }
  18.          
  19. printf("<br>%i",num);
  20.  
  21.             }else{
  22.                 printf("Error: argumentos no validos\n");
  23.                 return 1;
  24.                 }
  25.              
  26. return 0;
  27.  
  28. }

Pero no entiendo porque al enviarle el numero 100, el programa me muestra 99 y asi con algunos números, después lo demás aparentemente funciona bien.

Ademas porque el Dev-C++ a pesar de compilar el programa me muestra estos mensajes:

Código BASH:
Ver original
  1. C:\wamp\www\lpt\temporal.cpp In function `int main(int, char**)':
  2. 17 C:\wamp\www\lpt\temporal.cpp [Warning] converting to `int' from `double'
  #5 (permalink)  
Antiguo 25/06/2015, 00:20
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Convertir caracter a entero

Cita:
Iniciado por tabam Ver Mensaje
Pero no entiendo porque al enviarle el numero 100, el programa me muestra 99 y asi con algunos números, después lo demás aparentemente funciona bien.
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.

Cita:
Iniciado por tabam Ver Mensaje
Ademas porque el Dev-C++ a pesar de compilar el programa me muestra estos mensajes:

Código BASH:
Ver original
  1. C:\wamp\www\lpt\temporal.cpp In function `int main(int, char**)':
  2. 17 C:\wamp\www\lpt\temporal.cpp [Warning] converting to `int' from `double'
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.

Cita:
Iniciado por tabam Ver Mensaje
Lamentablemente no entiendo bien lo que me decís que tengo que hacer, aparte me confunde los punteros que utiliza C para obtener el parámetro que le estoy enviando desde PHP.
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
  #6 (permalink)  
Antiguo 25/06/2015, 22:42
 
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!!!!!!

Etiquetas: char, entero, int, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:14.