Je ferais les choses un peu différemment - initialiser un stringstream avec l'entrée, lire un int, puis vérifiez si le flux est vide:
#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;
}
Une autre possibilité raisonnable serait strtol ou un de ses les cousins. Ceux-ci renvoient un pointeur vers le premier caractère non converti (le cas échéant), de sorte qu'ils vous disent assez directement ce qui a été et n'a pas été converti. Ils sont plus rapides mais généralement moins flexibles que les flux - par exemple, si vous voulez lire un nombre à virgule flottante, le check_read ci-dessus fonctionnera tel quel, mais quelque chose utilisant strtol devra être réécrit.
Comme encore une possibilité de plus, vous pourriez envisager Boost lexical_cast (qui est empaqueté un peu différemment, mais assez similaire au code ci-dessus).
Doh! Désolé les gars, péter le cerveau. Doit avoir eu une sorte de bloc mental pour ne pas se souvenir de celui-ci et ne jamais le voir sur aucune de mes recherches –
lstrlen() c'est ... –