Функция Atoi в C не работает должным образом
Может кто-нибудь объяснить, почему функция atoi не работает с nuber, который имеет более 9 цифр.
Например:
Я ввел 123456789, программа говорит 123456789, но когда я ввел 12345678901, программа скажет -519403114... Спасибо за помощь.
int main ()
{
int i;
char szinput [256];
printf ("Enter a Card Number:");
fgets(szinput,256,stdin);
i=atoi(szinput);
printf("%d\n",i);
getch();
return 0;
}
3 ответа
Не использовать atoi()
или любой из atoi*()
функции, если вы заботитесь об обработке ошибок. Эти функции не позволяют обнаруживать ошибки; ни atoi(99999999999999999999)
ни atoi("foo")
может сказать вам, что возникла проблема. (Я думаю, что один или оба из этих случаев на самом деле имеют неопределенное поведение, но я должен проверить, чтобы быть уверенным.)
strto*()
функции немного сложны в использовании, но они могут надежно сказать вам, представляет ли строка допустимое число, находится ли она в диапазоне и каково ее значение. (Вы должны иметь дело с errno
чтобы получить полную проверку.)
Если вы просто хотите получить значение типа int, вы можете использовать strtol()
(который после проверки ошибок дает вам long
результат) и преобразовать его в int
после проверки того, что результат находится в представимом диапазоне int
(увидеть INT_MIN
а также INT_MAX
в <limits.h>
). strtoul()
дает вам unsigned long
результат. strtoll()
а также strtoull
() предназначены для long long
а также unsigned long long
соответственно; они новы в C99, и ваша реализация компилятора может их не поддерживать (хотя, вероятно, большинство реализаций не от Microsoft).
Потому что вы переполнены int
с таким большим значением.
Более того, atoi
устарела и поточно-небезопасна на многих платформах, поэтому лучше отказаться от нее в пользу strto(l|ll|ul|ull)
,
Рассмотреть возможность использования strtoull
вместо. поскольку unsigned long long
64-битный тип на большинстве современных платформ, вы сможете преобразовать число 2 ^ 64
(18446744073709551616
).
Чтобы распечатать unsigned long long
, использовать %llu
спецификатор формата.
Если вы пишете приложение для Win32, вы можете использовать реализацию atoi для Windows, подробности смотрите на странице ниже.
http://msdn.microsoft.com/en-us/library/czcad93k%28v=vs.80%29.aspx