API для проверки превышения максимального значения любого типа данных - PullRequest
1 голос
/ 14 апреля 2011

Есть ли API, чтобы проверить, превышает ли какой-либо номер его диапазон?

Мой номер хранится в виде строки.char *ptr = "123456789"

API должен делать: int a = api(ptr, long) если a == - 1 предполагает, что значение превышает.

Обратите внимание: мы не можем проанализировать строку и проверить, потому что она автоматически обернет еена другую сторону, и сделать это в пределах диапазона.

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Пожалуйста, проверьте strtol и strtoul .

См. Этот пример:

#include <stdlib.h>
#include <errno.h>
#include <limits.h>
int main (int argc, char const* argv[])
{
    char a[] = "123";
    char c[] = "123134123412341234";
    long b, d;
    errno = 0;
    b = strtol(a, NULL, 10);
    if((b == LONG_MAX || b == LONG_MIN) && errno == ERANGE ){
        printf("%s Out of range\n", a);
    }
    errno = 0;
    d = strtol(c, NULL, 10);
    if((d == LONG_MAX || d == LONG_MIN) && errno == ERANGE ){
        printf("%s Out of range\n", c);
    }
    return 0;
}

Правки:

  1. Изменено int на long для b и d.
  2. Установка errno на 0 перед вызовом в библиотеку c.
  3. Проверка на LONG_MIN также на наличие ошибок.
  4. Изменен порядок чеков (согласно комментарию ниже)
2 голосов
/ 14 апреля 2011

Ну, вы все еще можете проверить.Просто соберите число и проверьте, действительно ли число стало больше или меньше.

int i = 0; // pos indicator
int r = 0; // result
int c = 0; // check
while(ptr[i])
{
    c = r;
    r = r * 10 + (ptr[i++] - '0');
    if(r < c)
        print("overflow happened!\n");
}

Редактировать: обратите внимание, что это не будет работать с неподписанными типами данных, так как слишком легко переполнить достаточно, чтобы пройтичек.

1 голос
/ 14 апреля 2011

Просто используйте strol () или strtoll () и проверьте errno. Для меньших типов данных вам нужно создать очень простую функцию, которая сравнивает USHRT_MAX, UINT_MAX и т. Д. Из limit.h.

man strol и man limit.h для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...