2010-06-03 16 views
7

Ho problemi con isdigit. Ho letto la documentazione, ma quando cout < < isdigit (9), ottengo uno 0. Non dovrei ottenere un 1?isdigit() C++, probabilmente una domanda semplice, ma bloccato

#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; 
} 

risposta

16

isdigit() serve a verificare se un carattereè un personaggio cifre.

Se l'hai chiamato come isdigit('9'), restituirebbe diverso da zero.

Nel set di caratteri ASCII (che probabilmente stai utilizzando), 9 rappresenta la scheda orizzontale, che non è una cifra.


Dal momento che si sta utilizzando l'I/O flussi per l'ingresso, non è necessario utilizzare isdigit() per convalidare l'input. L'estrazione (vale a dire, std::cin >> k) avrà esito negativo se i dati letti dallo stream non sono validi, quindi se si prevede di leggere un int e l'utente immette "asdf", l'estrazione avrà esito negativo.

Se l'estrazione non riesce, verrà impostato il bit di fail sul flusso. È possibile verificare per questo e per gestire l'errore:

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

Nota che l'estrazione si restituisce anche il flusso, in modo da poter ridurre le prime due righe di essere semplicemente:

if (std::cin >> k) 

e il risultato sarà essere lo stesso.

+0

Non intendevo rubare la tua risposta. Ero fuori da Google e non ho visto la risposta. –

+1

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

+0

Quindi, come potrei verificare l'utenteInput poiché ho bisogno delle virgolette singole nelle parestes? – Crystal

0

isdigit() funziona sui caratteri, non sui valori ascii, che si stanno passando attualmente. Prova a utilizzare isdigit('9').

+0

La funzione è 'isdigit' (in minuscolo 'd'), probabilmente,' isdigit' può funzionare molto bene sui valori ASCII. – dreamlax

+0

Risolto il problema.Funzionerebbe bene su ASCII, ma dovresti sapere che stai usando ASCII e non passare un personaggio. Penso che stava provando a testare '9' non 'TAB' –

5

isdigit() prende uno int che è la rappresentazione del carattere. Il carattere 9 è (supponendo che tu stia utilizzando ASCII) il carattere TAB. Carattere 0x39 o '9' (non 9) è il carattere effettivo che rappresenta la cifra 9.

I caratteri numerici sono codici interi 0x30 attraverso 0x39 (o 48 attraverso 57) in ASCII - I ribadire che poiché ASCII non è un requisito dello standard ISO C. Da qui il seguente codice:

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

che ho visto prima, non è una buona idea per la portabilità poiché non v'è almeno un'applicazione che utilizza EBCDIC sotto le coperte - isdigit è l'opzione migliore in tutte le situazioni.

+1

+1 per notare la firma della funzione corretta, dimostrando l'intercambiabilità di' char' e 'int'. –

+3

Lo standard richiede tuttavia che il valore del carattere delle cifre sia sequenziale da 0 a 9. Quindi, 'if ((c> = '0') && (c <= '9'))' funzionerebbe. Lo stesso è * non * vero per i caratteri alfabetici. – dreamlax

+0

IIRC 'isdigit ('1')' potrebbe anche restituire true - char può anche essere un superset di ASCI. – MSalters