me gustaría hacer las cosas un poco diferente - Iniciar una stringstream con la entrada, leer un int, a continuación, comprobar si la secuencia está vacía:
#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;
}
Otra posibilidad sería razonable strtol o uno de sus primos. Estos devuelven un puntero al primer carácter no convertido (si lo hay), por lo que le informan de manera bastante directa qué fue y qué no se convirtió. Son más rápidos, pero en general son menos flexibles que las transmisiones; por ejemplo, si desea leer un número de punto flotante, el check_read anterior funcionará como está, pero algo que use strtol debería ser reescrito.
Como una posibilidad más, puede considerar Boost lexical_cast (que está empaquetado de forma un poco diferente, pero bastante similar al código anterior).
Doh! Lo siento chicos, pedo cerebro. Debe haber tenido algún tipo de bloqueo mental para no recordar este y nunca verlo en ninguna de mis búsquedas –
lstrlen() es ... –