Я бы поступил немного иначе - инициализировал поток ввода с помощью ввода, прочитал int, а затем проверил, пуст ли поток:
#include <sstream>
#include <iostream>
typedef char const *LPCSTR;
template <class T>
bool check_read(LPCSTR input, T &val) {
std::istringstream reader(input);
reader >> val;
char ch;
if (reader >> ch) {
std::cerr << "\nUnconverted character: " << ch << std::endl;
return false;
}
return true;
}
int main() {
LPCSTR inputs[] = {"12345", "54321a"};
int a;
for (int i=0; i<2; i++) {
check_read(inputs[i], a);
std::cout << "Converted: " << a << std::endl;
}
return 0;
}
Другой разумной возможностью был бы strtol или один из его кузенов. Они возвращают указатель на первый не преобразованный символ (если он есть), поэтому они довольно точно сообщают вам, что было и не было преобразовано. Они быстрее, но, как правило, менее гибкие, чем потоки - например, если вы хотите прочитать число с плавающей запятой, приведенный выше check_read будет работать как есть, но что-то, использующее strtol, должно быть переписано.
В качестве еще одной возможности вы можете рассмотреть Boost lexical_cast (который упакован немного по-другому, но довольно похож на приведенный выше код).