2010-06-03 10 views
7

Tengo problemas con isdigit. Leí la documentación, pero cuando cout < < isdigit (9), obtengo un 0. ¿No debería obtener un 1?isdigit() C++, probablemente es una pregunta simple, pero está atascado

#include <iostream> 
#include <cctype> 
#include "Point.h" 

int main() 
{ 
    std::cout << isdigit(9) << isdigit(1.2) << isdigit('c'); 
    // create <int>i and <double>j Points 
    Point<int> i(5, 4); 
    Point<double> *j = new Point<double> (5.2, 3.3); 

    // display i and j 
    std::cout << "Point i (5, 4): " << i << '\n'; 
    std::cout << "Point j (5.2, 3.3): " << *j << '\n'; 

    // Note: need to use explicit declaration for classes 
    Point<int> k; 
    std::cout << "Enter Point data (e.g. number, enter, number, enter): " << '\n' 
     << "If data is valid for point, will print out new point. If not, will not " 
     << "print out anything."; 
    std::cin >> k; 
    std::cout << k; 

    delete j; 
} 

Respuesta

16

isdigit() es para comprobar si un personaje es un personaje dígitos.

Si lo llamó como isdigit('9'), devolvería distinto de cero.

En el conjunto de caracteres ASCII (que probablemente esté utilizando), 9 representa la pestaña horizontal, que no es un dígito.


Puesto que usted está utilizando la E/S corrientes de entrada, que no es necesario utilizar isdigit() para validar la entrada. La extracción (es decir, std::cin >> k) fallará si los datos leídos de la secuencia no son válidos, por lo que si espera leer un int y el usuario ingresa "asdf", la extracción fallará.

Si la extracción falla, se establecerá el bit de falla en la transmisión. Puede comprobar esto y manejar el error:

std::cin >> k; 
if (std::cin) 
{ 
    // extraction succeeded; use the k 
} 
else 
{ 
    // extraction failed; do error handling 
} 

Tenga en cuenta que la extracción en sí también devuelve la corriente, por lo que puede acortar las dos primeras líneas a ser simplemente:

if (std::cin >> k) 

y el resultado será ser el mismo.

+0

No quise robar tu respuesta. Estaba fuera de googlear y no vi la respuesta. –

+1

'isdigit', no' isDigit';) – tzaman

+0

Entonces, ¿cómo verifico el userInput ya que necesito las comillas simples en las parantheses? – Crystal

0

isdigit() funciona en los caracteres, no en los valores de ascii, que está pasando actualmente. Intenta usar isdigit('9').

+0

La función es 'isdigit' (minúscula 'd'), podría decirse que' isdigit' puede funcionar muy bien en valores ASCII. – dreamlax

+0

Corregido eso.Funcionaría bien en ASCII, pero tendrías que saber que estabas usando ASCII y no pasando un personaje. Creo que estaba tratando de probar '9' no 'TAB' –

5

isdigit() toma un int que es la representación del personaje. El carácter 9 es (suponiendo que esté usando ASCII) el carácter TAB. Carácter 0x39 o '9' (no 9) es el carácter real que representa el dígito 9.

Los caracteres dígitos son códigos enteros 0x30 a través de 0x39 (o 48 a través de 57) en ASCII - I reiteran que desde ASCII no es un requisito del estándar ISO C. Por lo tanto el siguiente código:

if ((c >= 0x30) && (c <= 0x39)) 

la que he visto antes, no es una buena idea para la portabilidad, ya que hay al menos una aplicación que utiliza EBCDIC bajo las sábanas - isdigit es la mejor opción en todas las situaciones.

+1

+1 para observar la firma de la función correcta, lo que demuestra la intercambiabilidad de 'char' y' int'. –

+3

Sin embargo, el estándar obliga a que el valor de los caracteres de los dígitos sea secuencial de 0 a 9. Entonces, 'if ((c> = '0') && (c <= '9'))' funcionaría. Lo mismo es * no * verdadero para caracteres alfabéticos. – dreamlax

+0

IIRC 'isdigit ('1')' también podría devolver true - char también puede ser un superconjunto de ASCI. – MSalters