Cita de: leosansan en 8 Marzo 2014, 07:00 AMEl método que propones tiene un pero, si introduces 12as toma 12 como int.En ese caso nada impide verificar el resto del stream con una lectura adicional, las funciones eof/get, etc. Por ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <string>
using std::string;
using std::getline;
#include <sstream>
using std::istringstream;
int main()
{
bool ok = false;
int num;
do {
cout << "Introduce un numero: ";
string linea;
getline(cin, linea);
istringstream is(linea);
char ch;
if (is >> num && !(is >> ch))
ok = true;
else
cout << "Entrada no valida" << endl;
}while (!ok);
cout << "num == " << num << endl;
return 0;
}
----
Cita de: yoel_alejandro en 9 Marzo 2014, 17:48 PMLa biblioteca <limits.h> define los máximos posibles para los distintos tipos aritméticos según la puesta en práctica. Por ejemplo, CHAR_MAX, SHRT_MAX, UINT_MAX define los máximos de char, short int y unsigned int respectivamente, y son valores que dependen de la implementación de C en tu máquina particular. Así que el programa podría quedar algo así como:Un problema con ese fragmento es el uso de atoi, por razones obvias su valor de retorno no puede ser mayor a INT_MAX. Para conocer si un numero esta fuera del rango valido para un tipo entero se deben utilizar las funciones strtol, strtoll (C++11), etc. dependiendo del caso (y del modo de compilación).Código (cpp) [Seleccionar]/** INT && UINT **/
if(s[0]=='-')
sign=true;
if ( allNumeric(s.substr(sign, s.size()))) {
if(sign) {
if ( atoi(s.substr(1, s.size())) <= INT_MAX )
type+=type_int;
}else{
if ( atoi(s.substr(0, s.size())) <= INT_MAX )
type+=type_int;
if ( atoi(s.substr(0, s.size())) <= UINT_MAX)
type+=type_uint;
}
}
Un saludo