-
- //copyright@njnu_mjn 2013
- int StrToDecInt(const char* str)
- {
- static const int MAX = (int)((unsigned)~0 >> 1);
- static const int MIN = -(int)((unsigned)~0 >> 1) - 1;
- static const int MAX_DIV = (int)((unsigned)~0 >> 1) / 10;
- static const int MIN_DIV = (int)((((unsigned)~0 >> 1) + 1) / 10);
- static const int MAX_R = (int)((unsigned)~0 >> 1) % 10;
- static const int MIN_R = (int)((((unsigned)~0 >> 1) + 1) % 10);
- int n = 0;
- int sign = 1;
- int c;
- while (isspace(*str))
- ++str;
- if (*str == '+' || *str == '-')
- {
- if (*str == '-')
- sign = -1;
- ++str;
- }
- while (isdigit(*str))
- {
- c = *str - '0';
- if (sign > 0 && (n > MAX_DIV || (n == MAX_DIV && c >= MAX_R)))
- {
- n = MAX;
- break;
- }
- else if (sign < 0 && (n > MIN_DIV || (n == MIN_DIV && c >= MIN_R)))
- {
- n = MIN;
- break;
- }
- n = n * 10 + c;
- ++str;
- }
- return sign > 0 ? n : -n;