Разбор строки c в int в target-c во избежание переполнения

0

В NSStirng -c я бы проанализировал строку ac (а не NSStirng) для int, а также проверил, не слишком ли велико или слишком мало для int?

Я нашел несколько полезных ссылок, подобных этому: http://www.fefe.de/intof.html

Но я не смог найти пример кода, который покажет мне, как это сделать. Я пробовал играть с strtoumax() и UINT_MAX но не нашел достаточно четких примеров, чтобы знать, как их правильно использовать.

Я также знаю, чтобы избежать atoi()

Обновление 2014.04.12

Что-то вроде этого мудрого? Я думаю, что это изворотливое, как я использую long а затем меняю его на int. Другое дело, что я полностью удалил && errno == ERANGE поскольку он просто не работал с ним. Это также мудро?

bool to_int(const char* str, int* val) 
{     
    char* nptr = NULL;
    long x = strtol(str, &nptr, 10);  
    printf("long %ld\n",x);
    if (((x > INT_MAX) || (x < INT_MIN))) 
        return false; //Value is invalid..  

    *val = (int)x;
    return true; // Value is valid
}


int main()
{

    int val = 0;
    char testVal[] = "2147483647";

    if (to_int(testVal, &val))
    {
        printf("Valid integer: %d\n", val);
    }
    else
    {
        printf("Invalid integer %d\n", val);
    }     
}
return 0;
}
Теги:
parsing
int

1 ответ

0
Лучший ответ
#include <inttypes.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

bool to_int(const char* str, int* val) //Takes a string and a pointer to an int.
{
    errno = 0;
    *val = 0;
    char* nptr = NULL;
    long int lval = strtol(str, &nptr, 10);

    if (((lval > INT_MAX) || (lval < INT_MIN) || (lval == LONG_MAX) || (lval == LONG_MIN)) && errno == ERANGE) //Check for ERANGE being set.
        return false; //Value is invalid..

    errno = 0;
    *val = (int)lval;
    return true; //Value is valid..
}


int main()
{
    int val = 0;

    if (to_int("2147483647", &val))
    {
        printf("Valid integer: %d", val);
    }
    else
    {
        printf("Invalid integer");
    }
}
  • 0
    Вы должны установить errno = 0 перед вызовом strtol() потому что успешное преобразование не сбрасывает errno.
  • 1
    Обратите внимание, что strtol возвращает long , а не int . Вы, вероятно, не должны предполагать, что типы эквивалентны, так как на некоторых платформах int 32-битный, а long 64-битный, что сделает ваш код проверки ошибок неверным.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню