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

Pasar de cadena de caracteres a INT

Estas en el tema de Pasar de cadena de caracteres a INT en el foro de C/C++ en Foros del Web. Hola, pues resulta que llevo intentando pasar de una cadena de caracteres a un INT y no lo consigo, he intentado hacer un cast pero ...
  #1 (permalink)  
Antiguo 09/05/2013, 04:48
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 16 años, 2 meses
Puntos: 2
Pasar de cadena de caracteres a INT

Hola, pues resulta que llevo intentando pasar de una cadena de caracteres a un INT y no lo consigo, he intentado hacer un cast pero tampoco funciona. al leer tsanitaria[i] coge otro numero correspondiente a la dirección o algo asi.

Código C:
Ver original
  1. void iniciosesion(int *id, char tsanitaria[],int longitudtsanitaria){
  2.  
  3.     int i=0, fid=0,n;
  4.     for(i=0;i<longitudtsanitaria;i++){
  5.         n=(int)tsanitaria[i];
  6.         fid+=(n)*10^(longitudtsanitaria-(i+1));
  7. }
  8.     *id=fid;
  9. }

Muchas gracias de antemano!
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma
  #2 (permalink)  
Antiguo 09/05/2013, 06:23
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Pasar de cadena de caracteres a INT

C o C++?

En C puedes usar algo como esto:

Cita:
int N = 2;
char* Buff = new char; // Variable auxiliar
sprintf (Buff,"%d",N); // Para pasar de numero a char

tsanitaria[i] = *Buff;
Para C++ es más fácil esto:

Cita:
int N = 2;
stringstream Buffer;
Buffer<<N; // Insertamos el numero
Buffer<<" es el numero transformado"; // Añadimos texto adicional

string Mensaje = Buffer.str(); // Pasar a string

cout<<Mensaje;
  #3 (permalink)  
Antiguo 09/05/2013, 10:47
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Pasar de cadena de caracteres a INT

Código C:
Ver original
  1. void iniciosesion(int *id, char tsanitaria[],int longitudtsanitaria){
  2.  
  3.     int i=0, fid=0,n;
  4.     for(i=0;i<longitudtsanitaria;i++){
  5.         n=(int)tsanitaria[i];
  6.         fid +=  fid * 10 + n
  7. }
  8.     *id=fid;
  9. }

Esto es lo que necesitas---
  #4 (permalink)  
Antiguo 09/05/2013, 11:26
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 10 meses
Puntos: 46
Respuesta: Pasar de cadena de caracteres a INT

amchacon, según tengo entendido, el operador new en C no existe, hay que usar malloc. Aunque lo que dice sam90 es más sencillo.
  #5 (permalink)  
Antiguo 09/05/2013, 11:29
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Y usar atoi?
  #6 (permalink)  
Antiguo 09/05/2013, 12:14
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Pasar de cadena de caracteres a INT

Cita:
Iniciado por L3m0n Ver Mensaje
amchacon, según tengo entendido, el operador new en C no existe, hay que usar malloc. Aunque lo que dice sam90 es más sencillo.
Epic fail xD

Además mis códigos son para pasar de int a cadena *_*

Cita:
Iniciado por Malenko Ver Mensaje
Y usar atoi?
Solo funciona en Windows, mejor apostar por soluciones multiplataforma.
  #7 (permalink)  
Antiguo 09/05/2013, 12:21
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Pasar de cadena de caracteres a INT

La funcion estandar de atoi es atol, pero si quieres tambien puedes probar con strtol; ambas son portables.

Saludos
vosk
  #8 (permalink)  
Antiguo 09/05/2013, 15:01
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Pasar de cadena de caracteres a INT

"... al leer tsanitaria[i] coge otro numero correspondiente a la dirección o algo asi..."

Esto te retorna el ascii del caracter numerico, lo que tienes que hacer para convertir el caracter numerico a entero es enviar el caracter a una de las funciones citadas, entonces obtienes el numero como entero y puedes usarlo en la ecuacion o lo que tengas.

P.ej. a lo facil el ascii de 0 es 48, el de 1 es 49, etc, entonces solo tienes que restar el ascii del caracter numerico 0 del ascii de los caracteres numericos que tengas:

Código:
n = tsanitaria[i] - '0';

//por ejemplo el caracter '1' es 49, luego '1'-'0' = 49 - 48 = 1
Saludos
vosk
  #9 (permalink)  
Antiguo 09/05/2013, 16:08
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Pasar de cadena de caracteres a INT

Cita:
La funcion estandar de atoi es atol
atoi no es estandar?? hasta donde tenia entendido si era - C89 ... Podrian decirme cual es el inconveniente de esta funcion?? en especial porque consideran q no es portable

Saludos

Última edición por cesar_casla; 09/05/2013 a las 16:17
  #10 (permalink)  
Antiguo 10/05/2013, 01:49
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Pasar de cadena de caracteres a INT

Cita:
Iniciado por cesar_casla Ver Mensaje
atoi no es estandar?? hasta donde tenia entendido si era - C89 ... Podrian decirme cual es el inconveniente de esta funcion?? en especial porque consideran q no es portable

Saludos
Sí, yo tampoco acabo de verle el problema :S
__________________
Aviso: No se resuelven dudas por MP!
  #11 (permalink)  
Antiguo 10/05/2013, 05:15
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Pasar de cadena de caracteres a INT

Hola, gracias a todos por sus respuestas, he probado las opciones que entendí, la única que me permitió avanzar fue la de vosk. Los unos los interpreta como 49s, entonces hice la resta para que quedase 1, el problema es que, al hacer la operacion, no debe interpretarlo bien. Si la tarjeta sanitaria es 1111. Recoje las Ns correctamente, pero al entrar en el for, en el caso anterior el resultado da 9 y el siguiente 8 :S. Aquí el código hasta ahora:

Código C:
Ver original
  1. void iniciosesion(int *id, char tsanitaria[],int longitudtsanitaria){
  2.  
  3.     int i=0, fid=0,n;
  4.     for(i=0;i<longitudtsanitaria;i++){
  5.         n=(int)tsanitaria[i] - 48; // también probé a restarle '0'
  6.         fid+=((n)*10)^(longitudtsanitaria-(i+1));
  7. }
  8.     *id=fid;
  9. }
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma
  #12 (permalink)  
Antiguo 10/05/2013, 05:59
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Pasar de cadena de caracteres a INT

En cualquier manual de C encontraras que la funcion atoi está obsoleta, por lo que deja de formar parte del estandar aun cuando por motivos de libreria siga existiendo esa funcion.

Por otra parte la funcion atoi no tiene capacidad para manejar errores por lo que desaconseja su uso (aun sabiendo que esta obsoleta). Para usarse de forma segura (y no en todos los casos) es necesario comprovar que todos los caracteres que se espera que se conviertan sean numericos, y aun asi para la conversion del caracter "0" de forma aislada debe hacerse manualmente porque atoi retorna el mismo valor que cuando recibe un char* que no puede convertir.

Lo que normalmente se usa es strtol porque es estandar y permite el control de errores.

Una simple busqueda en google seguramente obtendreis una lista infinita de consultas en foros sobre porque atoi falla al convertir determinadas cadenas, y seguramente encontrareis muchas entradas donde se detalle mas tecnicamente que lo que acabo de exponer el porque de no usar atoi.


"...Sí, yo tampoco acabo de verle el problema..."

Ok, si yo voy a entrar una cadena tal como "123" obviamente no hay problema; el problema esta en que si quieres hacer una aplicacion distribuible (ya no digo comercializable) que cualquier persona puede entrar cualquier cosa cuando se solicita un entero tienes que usar funciones seguras y ademas tienes que implementar algun tipo de control de errores, con lo que atoi se queda fuera desde que puedes usar strtol. Seguramente en la red puedes encontrar alternativas para usar con atoi (como p.ej. reconvertir el entero a char* y comprovar si es igual al inicial), pero bueno el uso de este tipo de soluciones ya depende del criterio de cada uno.

Saludos
vosk
  #13 (permalink)  
Antiguo 10/05/2013, 07:47
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Pasar de cadena de caracteres a INT

Cita:
Iniciado por vosk Ver Mensaje
En cualquier manual de C encontraras que la funcion atoi está obsoleta, por lo que deja de formar parte del estandar aun cuando por motivos de libreria siga existiendo esa funcion.
Puedes indicar alguna referencia? O es simplemente un dato lanzado al aire?

Yo hasta donde he estado buscando/encontrando:

http://linux.die.net/man/3/atoi
http://www.bigbiz.com/cgi-bin/manpage?atoi

etc.

Ahora, podrias indicar algun link/manual donde se especifica que la función está obsoleta y que deja de forma parte del estandar?

Gracias!
__________________
Aviso: No se resuelven dudas por MP!
  #14 (permalink)  
Antiguo 10/05/2013, 09:46
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Pasar de cadena de caracteres a INT

EL operador ^ no es lo que piensas. No es el operador potencia. Para eso tenes que usar la función Pow(a,b);

O sino como te mostré yo (nada mas que antes me olvide de restar 48):


Código C:
Ver original
  1. void iniciosesion(int *id, char tsanitaria[],int longitudtsanitaria){
  2.  
  3.     int i=0, fid=0,n;
  4.     for(i=0;i<longitudtsanitaria;i++){
  5.         n=(int)tsanitaria[i] - 48; // también probé a restarle '0'
  6.         fid = find * 10 + n;
  7.         //  fid+=pow(  ((n)*10) , (longitudtsanitaria-(i+1)) ) ;
  8. }
  9.     *id=fid;
  10. }

Para usar pow vas a necesitar incluir la librería math.
  #15 (permalink)  
Antiguo 10/05/2013, 12:50
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Pasar de cadena de caracteres a INT

"...Puedes indicar alguna referencia?..."

Si

"...O es simplemente un dato lanzado al aire?..."

Espero que no


https://www.securecoding.cert.org/co...lete+functions

http://www.codecogs.com/reference/co...lib.h/atoi.php


Hay mas links, pero segun entiendo yo de todos los que acabo de revisar (por si acaso la estuviera cagando): la funcion está obsoleta (algunos manuales indican obsolete y algunos deprecated, que no es lo mismo) por lo que se mantiene en la libreria por motivos de compatibilidad hasta la nueva revision donde seguramente será eliminada (debido a los problemas de seguridad).

Es decir: hay una funcion obsoleta que actualmente forma parte del estandar (como bien decis Malenko y cesar_casla) pero solo por motivos de libreria; sabiendo que la funcion es obsoleta, que puede provocar errores y que hay versiones actualizadas para hacer lo mismo ¿que sentido tiene intentar mantener esa funcion? Vale: es facil de escribir, es facil de usar, es facil de recordar el nombre, pero no tiene control de errores y no es segura en multiprocesos; con esto creo recordar que cualquier mantenimiento no solo de librerias (sino de otros componentes) se limita a dejar la funcion hasta que alguien se atreva a quitarla, es decir que sobre atoi no se hacen mas revisiones de seguridad ni se actualiza la descripcion (a menos que no sea para poner que esta obsoleta). Segun mi forma de ver atoi ya no forma parte del estandar aun cuando esta dentro de la stdlib; cualquier aplicacion que actualmente implemente codigo con esta funcion está trabajando con una funcion no revisada, y a menos que esté 100% seguro de los datos que va a enviar a esa funcion estará creando una aplicacion insegura, no creo que sea el camino correcto (y no digo si es para hacer alguna aplicacion que use alguna empresa para trabajar).

Saludos
vosk
  #16 (permalink)  
Antiguo 11/05/2013, 15:19
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Pasar de cadena de caracteres a INT

Gracias a todos, pero ya que veo que no es nada sencillo intentare apañarme con la cadena de caracteres. muchas gracias
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma
  #17 (permalink)  
Antiguo 11/05/2013, 15:41
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Pasar de cadena de caracteres a INT

Como? No hombre no, que es muy facil. Si quires convertir un caracter numerico a su entero solo tienes que aplicar lo de los ascii:

Código:
char caracteres[] = "1234567890";
int q, entero;

for(q = 0; q < strlen(caracteres); q++) {
	entero = caracteres[q] - '0';
}
Y si quires convertir todo el numero de una cadena de caraceres numericos solo tienes que aplicar alguna funcion de conversion, yo me decanto por strtol:

Código:
char caracteres[] = "2013";
long int entero;
	
entero = strtol(caracteres, 0, 10);
Los argumentos de strtol puedes encontrarlos en cualquier manual de c, basicamente son la cadena de texto donde buscar enteros, un puntero donde se guarda el siguiente texto al numerico encontrado (en caso que haya alguno), y la base numerica. Pongo otro ejemplo de strtol y su magia:

Código:
char *pch, caracteres[] = "2013 05 11";
long int entero;

pch = NULL;
while(1) {
	if((entero = strtol((pch)?pch:caracteres, &pch, 10)) == 0L) {
		break;
	}
	printf("%d\n", entero);
}
Saludos
vosk

Etiquetas: cadena, caracteres, funcion, int
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 13:52.