В NSStirng
-c я бы проанализировал строку ac (а не NSStirng
) для int, а также проверил, не слишком ли велико или слишком мало для int?
Я нашел несколько полезных ссылок, подобных этому: http://www.fefe.de/intof.html
Но я не смог найти пример кода, который покажет мне, как это сделать. Я пробовал играть с strtoumax()
и UINT_MAX
но не нашел достаточно четких примеров, чтобы знать, как их правильно использовать.
Я также знаю, чтобы избежать atoi()
Что-то вроде этого мудрого? Я думаю, что это изворотливое, как я использую 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;
}
#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");
}
}
errno = 0
перед вызовомstrtol()
потому что успешное преобразование не сбрасывает errno.strtol
возвращаетlong
, а неint
. Вы, вероятно, не должны предполагать, что типы эквивалентны, так как на некоторых платформахint
32-битный, аlong
64-битный, что сделает ваш код проверки ошибок неверным.