Skip to content

Instantly share code, notes, and snippets.

@Madsy
Last active August 29, 2015 14:12
Show Gist options
  • Select an option

  • Save Madsy/fa2e56fc34f40ec23431 to your computer and use it in GitHub Desktop.

Select an option

Save Madsy/fa2e56fc34f40ec23431 to your computer and use it in GitHub Desktop.
#include <string>
#include <iostream>
#include <climits>
#include <cctype>
using namespace std;
enum AtoiErr {
NoError,
NotANumber,
ValueOutOfRange
};
/* Expects at least one digit or a + or - sign followed by at least
one digit. Junk after the number is ignored and not a failure. */
static int myAtoi(const char* s, int& err){
err = NoError;
if ((*s != '+' && *s != '-' && !isdigit(*s)) ||
((*s == '+' || *s == '-') && !isdigit(*(s + 1)))){
err = NotANumber;
return 0;
}
bool hasPrefix = (*s == '-' || *s == '+');
const char* p = s;
if (hasPrefix) p++;
unsigned int number = 0;
for (; i *p && isdigit(*p); p++){
unsigned int number2 = number*10 + (*p - '0');
if (number2 < number){
//overflow
err = ValueOutOfRange;
return 0;
}
else {
number = number2;
}
}
if (hasPrefix && *s == '-'){
if (number > (INT_MAX + 1u)){
//underflow
err = ValueOutOfRange;
return 0;
}
return (int)number * -1;
}
if (number > INT_MAX){
//overflow
err = ValueOutOfRange;
return 0;
}
return (int)number;
}
int main(int argc, const char* argv[])
{
if (argc < 2) return 0;
for (int i = 1; i < argc; i++){
int err = 0;
int val = 0;
cout << "Arg string: " << std::string(argv[i]) << endl;
val = myAtoi(argv[i], err);
cout << "Atoi result: ";
if (err == NotANumber)
cout << "NaN" << endl;
else if (err == ValueOutOfRange)
cout << "Value of out range of int" << endl;
else
cout << val << endl << endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment