2010-06-03 14 views
7

Mam problem z isdigit. Czytałem dokumentację, ale kiedy mam cout < < isdigit (9), dostaję 0. Nie powinienem dostać 1?isdigit() C++, prawdopodobnie proste pytanie, ale utknął

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

Odpowiedz

16

isdigit() jest do testowania, czy charakter jest cyfrą charakter.

Jeśli nazwałbyś to jako isdigit('9'), zwrócił wartość niezerową.

W zestawie znaków ASCII (który najprawdopodobniej jest używany), 9 odpowiada poziomej karcie, która nie jest cyfrą.


Ponieważ używasz I/O dla strumieni wejścia, nie trzeba używać isdigit() do sprawdzania poprawności danych wejściowych. Wyodrębnianie (tj., std::cin >> k) zakończy się niepowodzeniem, jeśli dane odczytane ze strumienia nie są prawidłowe, więc jeśli oczekuje się przeczytania int, a użytkownik wprowadzi "asdf", to wyodrębnienie zakończy się niepowodzeniem.

Jeśli wyodrębnianie nie powiedzie się, bit niepowodzenia w strumieniu zostanie ustawiony. można przetestować za to i obsługi błędu:

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

zauważyć, że sama ekstrakcja zwraca również strumień, więc można skrócić pierwsze dwie linijki być po prostu:

if (std::cin >> k) 

a wynik będzie być takim samym.

+0

Nie chciał ukraść twojej odpowiedzi. Byłem poza Google i nie widziałem odpowiedzi. –

+1

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

+0

Jak zatem zweryfikować userInput, ponieważ potrzebuję pojedynczych cudzysłowów w parantezach? – Crystal

0

isdigit() działa na znakach, a nie na wartościach ascii, które obecnie przechodzisz. Spróbuj użyć isdigit('9').

+0

Funkcja jest 'isdigit' (małe litery" d '), prawdopodobnie 'isdigit' może bardzo dobrze pracować na wartościach ASCII. – dreamlax

+0

Naprawiono.To by działało dobrze na ASCII, ale musiałbyś wiedzieć, że używasz ASCII i nie przekazujesz postaci. Myślę, że próbował przetestować "9", a nie "TAB" –

5

isdigit() ma postać int, która jest reprezentacją postaci. Postać 9 to (zakładając, że używasz ASCII) znak TAB. Charakter 0x39 lub „9” (nie 9) jest rzeczywisty charakter reprezentujący cyfrę 9.

Znaki cyfrowe kody są całkowitymi 0x30 przez 0x39 (lub 48 poprzez 57) w ASCII - Powtarzam, że skoro nie jest ASCII wymaganie normy ISO C. Stąd poniższy kod:

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

który widziałem wcześniej, nie jest dobrym pomysłem dla przenośności ponieważ istnieje co najmniej jedna realizacja, która wykorzystuje EBCDIC pod kołdrą - isdigit jest najlepszym rozwiązaniem w każdej sytuacji.

+1

+1, zwracając uwagę na prawidłową sygnaturę funkcji, demonstrując wymienność "char" i "int". –

+3

Standard powoduje jednak, że wartość znaku w cyfrach musi być sekwencyjna od 0 do 9. Tak więc, 'if ((c> = '0') && (c <= '9')) będzie działać. To samo jest * nie * prawdziwe dla znaków alfabetu. – dreamlax

+0

IIRC 'isdigit ('1')' może również zwrócić true - char może być również nadzbiorem ASCI. – MSalters