Discussion:
caso extraño con atoi
(demasiado antiguo para responder)
Wein
2005-10-19 15:09:02 UTC
Permalink
Hola a todos!

Quería comentar un caso que me ha pasado haciendo mis pinitos en C. Aún
estoy un poco verdecillo, pero he encontrado un problema al que no le
encuentro sentido.

Programando con el editor Dev-C++ 4.9.92, y simplificando el código al
máximo obtengo que...

#include <iostream>

int main()
{
int x=1;
char digito;

digito = '1';
printf("digito int: %d, digito char: %c \n\n", atoi(&digito),digito);

system("PAUSE");
return 0;
}

dando como resultado digito int: 1 char: 1. Hasta aquí todo correcto, pero
si inicializo la variable x (cabe recordar que la variable x no la uso, tan
solo la declaro e inicializo), por ejemplo a un numero entre el 48 al 57, me
da un valor distinto. Por ejemplo, si x=48, digito int me devuelve 10, x=49
digito int: 11...

Aún mas extraño, lo he probado en linux (Suse 9.3) y da el mismo error, pero
en MSVS 2003 lo hace bien!!
¿Podría tratarse de un error del compilador gcc g++? ¿Cómo podría
solucionarlo sin emigrar al MSVS?

Tropecé con ésto tratando de pasar el dígito de caracter a entero. Agradezco
la ayuda.
Zephryn Xirdal
2005-10-19 15:28:41 UTC
Permalink
Post by Wein
Hola a todos!
Quería comentar un caso que me ha pasado haciendo mis pinitos en C. Aún
estoy un poco verdecillo, pero he encontrado un problema al que no le
encuentro sentido.
Programando con el editor Dev-C++ 4.9.92, y simplificando el código al
máximo obtengo que...
#include <iostream>
int main()
{
int x=1;
char digito;
digito = '1';
printf("digito int: %d, digito char: %c \n\n", atoi(&digito),digito);
system("PAUSE");
return 0;
}
dando como resultado digito int: 1 char: 1. Hasta aquí todo correcto, pero
si inicializo la variable x (cabe recordar que la variable x no la uso, tan
solo la declaro e inicializo), por ejemplo a un numero entre el 48 al 57, me
da un valor distinto. Por ejemplo, si x=48, digito int me devuelve 10, x=49
digito int: 11...
Aún mas extraño, lo he probado en linux (Suse 9.3) y da el mismo error, pero
en MSVS 2003 lo hace bien!!
¿Podría tratarse de un error del compilador gcc g++? ¿Cómo podría
solucionarlo sin emigrar al MSVS?
Tropecé con ésto tratando de pasar el dígito de caracter a entero. Agradezco
la ayuda.
Te has armado la picha un lío.

atoi convierte una cadena (del tipo char*) a un valor numérico. Tu
digito es del tipo char, con lo que cuando te funciona es por suerte. Le
pasas la dirección a la que apunta el char, por lo que te imprimirá un 1
porque el 1 está en primer lugar, y luego atoi seguirá parseando la
dirección de memoria hasta que encuentre un valor extraño y se detenga.
El programa correcto sería:

#include <iostream>
#include <stdio.h>

int main()
{
int x=1;
char[16] digito; //ó: char[] digito="1";

strcpy(digito,"1");
printf("digito int: %d, digito char: %c \n\n",atoi(digito),digito);

system("PAUSE");
return 0;
}

Loading...