#include <cstdlib>
#include <iostream>
#include <iterator>
#include <stdexcept>
#include <string>

using namespace std;

int main() {
	const string foo[] = { "12", "1X", "X2" };

	for (const auto& i : foo) {
		{
		    char* size;
		    const int num = strtol(i.c_str(), &size, 10);
		
		    if(distance(i.c_str(), const_cast<const char*>(size)) == i.size()) {
		        cout << "strtol: " << num << endl;
		    } else {
		        cout << "strtol: error\n";
		    }
		}
		{
		    size_t size;
		    int num;
		
		    if(sscanf(i.c_str(), "%d%zn", &num, &size) == 1 && size == i.size()) {
		        cout << "sscanf: " << num << endl;
		    } else {
		        cout << "sscanf: error\n";
		    }			
		}

		{    
			try {
		        size_t size;
		        const auto num = stoi(i, &size);
		
		        if(size == i.size()) {
		            cout << "stoi: " << num << endl;
		        } else {
		            throw invalid_argument("invalid stoi argument");
		        }
	    	} catch(const invalid_argument& /*e*/) {
	        	cout << "stoi: error\n";
	    	}
    	}
	}
	return 0;
}