2010-06-03 31 views
7

Tôi đang gặp sự cố với isdigit. Tôi đọc tài liệu, nhưng khi tôi gọi < < isdigit (9), tôi nhận được 0. Tôi có nên nhận được 1 không?isdigit() C++, có lẽ là câu hỏi đơn giản, nhưng bị kẹt

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

Trả lời

16

isdigit() là để thử nghiệm liệu một nhân vật là một nhân vật chữ số.

Nếu bạn gọi nó là isdigit('9'), nó sẽ trả về không đồng bộ.

Trong bộ ký tự ASCII (bạn có thể sử dụng), 9 thể hiện tab ngang, không phải là chữ số.


Vì bạn đang sử dụng luồng I/O cho đầu vào, bạn không cần phải sử dụng isdigit() để xác thực thông tin nhập. Việc trích xuất (tức là, std::cin >> k) sẽ không thành công nếu dữ liệu đọc từ luồng không hợp lệ, vì vậy nếu bạn muốn đọc một int và người dùng nhập "asdf" thì trích xuất sẽ không thành công.

Nếu trích xuất không thành công, thì bit không thành công trên luồng sẽ được đặt. Bạn có thể kiểm tra này và xử lý các lỗi:

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

Lưu ý rằng việc khai thác bản thân cũng trả về dòng, vì vậy bạn có thể rút ngắn hai dòng đầu tiên được chỉ đơn giản là:

if (std::cin >> k) 

và kết quả sẽ giống nhau.

+0

Không có nghĩa là đánh cắp câu trả lời của bạn. Tôi đã tắt googleing và không thấy câu trả lời. –

+1

'isdigit', không phải là' isDigit';) – tzaman

+0

Vậy làm cách nào để tôi xác minh userInput vì tôi cần dấu nháy đơn trong các dấu ngoặc đơn? – Crystal

0

isdigit() hoạt động trên các ký tự, không phải giá trị ascii mà bạn hiện đang chuyển. Thử sử dụng isdigit('9').

+0

Hàm này là 'isdigit' (chữ thường' d '), được cho là, 'isdigit' có thể hoạt động rất tốt trên các giá trị ASCII. – dreamlax

+0

Đã sửa lỗi đó.Nó sẽ hoạt động tốt trên ASCII, nhưng bạn phải biết rằng bạn đang sử dụng ASCII và không truyền một ký tự. Tôi nghĩ rằng anh ấy đang thử kiểm tra '9' không phải 'TAB' –

5

isdigit() chụp int đại diện cho ký tự. Ký tự 9 là (giả sử bạn đang sử dụng ASCII) là TAB ký tự. Ký tự 0x39 hoặc '9' (không 9) là ký tự thực đại diện cho chữ số 9.

Ký tự chữ số là các số nguyên 0x30 đến 0x39 (hoặc 48 đến 57) trong ASCII - Tôi nhắc lại rằng vì ASCII không yêu cầu của tiêu chuẩn ISO C. Do đó đoạn mã sau:

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

mà tôi đã từng thấy trước đây, không phải là một ý tưởng tốt cho tính di động kể từ khi có ít nhất một thực hiện có sử dụng EBCDIC dưới tấm chăn - isdigit là lựa chọn tốt nhất trong mọi tình huống.

+1

+1 để chú ý đến chữ ký hàm đúng, thể hiện khả năng hoán đổi của' char' và 'int'. –

+3

Tuy nhiên, tiêu chuẩn này yêu cầu giá trị ký tự của các chữ số phải tuần tự từ 0 đến 9. Vì vậy, 'if ((c> = '0') && (c <= '9'))' sẽ hoạt động. Điều tương tự là * không * đúng đối với các ký tự chữ cái. – dreamlax

+0

IIRC 'isdigit ('๑')' cũng có thể trả về true - char cũng có thể là một siêu của ASCI. – MSalters