2009-04-24 33 views
8

soy nuevo aquí. Encontré este sitio en google.C++ verifique si el número es int/float

#include <iostream> 

using namespace std; 

void main() { 

    // Declaration of Variable 
    float num1=0.0,num2=0.0; 

    // Getting information from users for number 1 
    cout << "Please enter x-axis coordinate location : "; 
    cin >> num1; 

    // Getting information from users for number 2 
    cout << "Please enter y-axis coordinate location : "; 
    cin >> num2; 

    cout << "You enter number 1 : " << num1 << " and number 2 : " << num2 <<endl; 

necesito algo así, cuando los usuarios entran en caracteres alfabéticos, sería mostrar un error, dice, debe introducir los números.

Cualquier ayuda muy apreciada

+0

uso de funciones estándar: bucle a través de todos los caracteres en el valor y comprobar con isdigit() ver aquí para un ejemplo http://www.cplusplus.com/referencia/clibrary/cctype/isdigit/ –

Respuesta

6

usar algo como

if (static_cast<int>(num1) == num1) { 
    // int value 
} 
else { 
    // non-integer value 
} 
2

La entrada será echado para adaptarse a la variable que se está almacenando con cin. Debido a que está usando cin en num1 y num2 (que son flotantes), no importa qué número ingrese el usuario (hasta un grado), será un flotante.

4

Si desea verificar la entrada para entero/flotante/tampoco, no debe usar cin en un flotador. En su lugar, léala en una cadena y puede verificar si la entrada es válida o no.

Si cin lee un número no válido voy a entrar en un estado fallido, que se puede comprobar con el caso (cin.fail())

Sin embargo, es más fácil de leer la entrada como una cadena y luego convertir el entrada a un número entero o número flotante después.

isdigit (c) debe invocarse en un carácter que no sea un número entero. Por ejemplo, isdigit ('1') (fíjese en las comillas).

puede usar strtol para intentar convertir una cadena en un número entero. Dependiendo del resultado, puede intentar convertir a punto flotante.

+0

'strotol' no es compatible con los estándares. por otra parte, no veo la razón por la lectura en una cadena y luego usando' isdigit' o análisis manual tienen que ser más fácil de comprobar el estado de la falla . corriente –

+2

@Konrad Rudolph:?. en primer lugar, desde cuándo 'strtol' se convirtió en no conforme segundo lugar, la falla/éxito especificación de la corriente es a menudo diferente de la deseada por el usuario, por ejemplo, la corriente permitirá' 123abc' entrada, sto pping at 'a', mientras que el usuario puede querer rechazar dicha entrada. Es por eso que leer una cadena y luego hacer un análisis "manual" con 'strtol' funciona mejor la mayor parte del tiempo. – AnT

+0

@AndreyT No tengo idea de por qué pensé que 'strtol' no es estándar. Pero sobre su queja con las transmisiones, la solución a este problema sería verificar también 'eof'. Todavía no veo por qué la indirección a través de una cadena (y tal vez 'strtol') debería ser "más fácil". –

3

Aunque otros ya han respondido la pregunta, me gustaría señalar para qué se usa realmente isdigit. Te dice si un personaje dado representa un número o no.

Básicamente, la definición de isdigit puede ser:

int isdigit (int c) 
{ 
    if (c >= '0' && c <='9') 
     return 1; 
    else 
     return 0; 
} 

Entonces, si usted tiene una cadena "asdf1234", se puede comprobar cada carácter individual para comprobar si se trata de un dígito/número:

char *test = "asdf1234"; 
int i; 

for (i = 0; i < strlen (test); i++) 
{ 
    if (isdigit (test[i])) 
     fprintf (stdout, "test[%d] is a digit!\n", i); 
} 
+0

Sí. También debe aceptar menos, más, mil y separadores decimales utilizado en la localidad actual (no sólo 0-9) – Jem

+0

probablemente debería aceptar también espacios iniciales y finales. Aquellos que no pasan "isdigit", pero aún pueden ser partes válidas de la entrada (aunque deben eliminarse tan pronto como sea posible). – abelenky

+0

@Jem: la definición de isdigit de ANSI C no verifica los separadores de más, menos, agrupación o decimales. isdigit devuelve un valor distinto de cero solo si el parámetro es un dígito, y nada más. Pruébalo en tu sistema y mira. Un analizador de números apropiado usaría una función más completa que isdigit, pero el propósito de mi respuesta era solo explicar el isdigit. – dreamlax

1

lea siempre el número en una cadena y comprobar los mismos que a continuación: -

template <class out_type, class in_type> 
out_type convert(in_type const& t) 
{ 
    std::stringstream stream; 
    stream << t; // insert value to stream 
    // store conversion’s result here 
    out_type result; 
    stream >> result; // write value to result 
    // if there is a failure in conversion the stream will not be empty 
    // this is checked by testing the eof bit 
    if (! stream.eof()) // there can be overflow also 
    { // a max value in case of conversion error 
    result = std::numeric_limits<out_type>::max(); 
    } 
    return result; 
} 

Se utiliza como

int iValue = convert<int>(strVal); 
if (std::numeric_limits<int>::max() == iValue) 
{ 
    dValue = convert<double>(strVal); 
} 

Esto es un poco más moderna de hacerlo :-)

0

Puede almacenar la entrada en una cadena, y luego crear una función como esta:

 
bool GetInt(const char *string, int *out) 
{ 
    char *end; 

    if (!string) 
     return false; 

    int ret_int = strtoul(string, &end, 10); 

    if (*end) 
     return false; 

    *out = ret_int; 
    return true; 
} 

getInt ("1234", & somevariable) devuelve verdadero y conjuntos someVariable a 1234. getInt ("abc", & somevariable) y getInt ("1234aaaa", & somevariable) tanto volver falsa.Esta es la versión de flotación por cierto:

 
HOT RESULT_MUST_BE_CHKED NONNULL bool GetFloat(const char *string, float *out) 
{ 
    char *end; 

    if (!string) 
     return false; 

    float ret_float = (float)strtod(string, &end); 

    if (*end) 
     return false; 

    *out = ret_float; 
    return true; 
} 
17

en primer lugar, responde tu pregunta. Esto es realmente muy fácil y no es necesario que cambie mucho en el código:

cout << "Please enter x-axis coordinate location : " << flush; 
if (!(cin >> num1)) { 
    cout << "You did not enter a correct number!" << endl; 
    // Leave the program, or do something appropriate: 
    return 1; 
} 

Este código básicamente comprueba si la entrada se ha analizado válidamente como un número de coma flotante - si eso no sucedió, señala un error.

En segundo lugar, el tipo de retorno de mainnecesidadsiempre ser int, nunca se void.

+0

¿Qué significa' flush'? – 0x499602D2

+1

http://en.cppreference.com/w/cpp/io/manip/flush –

0
//Just do a type cast check 
if ((int)(num1) == num1){ 
//Statements 
} 
+0

Preferiría un elenco de estilo C++ (es decir, static_cast) al estilo C aquí. – Flexo

0

que querían validar la entrada y necesitaba para asegurarse de que el valor numérico entró fue por lo que podría ser almacenado en una variable numérica. Finalmente este trabajo para mí (fuente: http://www.cplusplus.com/forum/beginner/2957/

int number; 
do{ 
     cout<<"enter a number"<<endl; 
     cin>>number; 
     if ((cin.fail())) { 
     cout<<"error: that's not a number!! try again"<<endl; 
     cin.clear(); // clear the stream 
     //clear the buffer to avoid loop (this part was what I was missing) 
     cin.ignore(std::numeric_limits<int>::max(),'\n'); 
     cout<<"enter a number"<<endl; //ask again 
     cin>>number; 
     } 

} while (cin.fail()); 
Cuestiones relacionadas