zrobiłbym rzeczy trochę inaczej - zainicjować stringstream z wejściem, przeczytaj int, a następnie sprawdzić, czy strumień jest pusta:
#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;
}
Inną możliwością byłoby rozsądne strtol lub jeden z jego kuzyni. Zwracają one wskaźnik do pierwszej nieskonwertowanej postaci (jeśli istnieje), więc informują o tym bezpośrednio, co było i nie zostało przekształcone. Są szybsze, ale generalnie mniej elastyczne niż strumienie - na przykład, jeśli chcesz odczytać liczbę zmiennoprzecinkową, parametr check_read powyżej będzie działał tak, jak jest, ale coś, co używa strtol, musiałoby zostać przepisane.
Jeszcze jedna możliwość, możesz rozważyć Boost leksykalny_pakiet (który jest nieco inny, ale całkiem podobny do powyższego kodu).
Doh! Przepraszam chłopaki, pierdnięcie mózgu. Musiał mieć jakąś mentalną blokadę, żeby nie pamiętać tego i nigdy go nie widziałem w żadnym z moich poszukiwań –
lstrlen() to ... –