Функция 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

Другие вопросы по тегам