2010-01-07 46 views
11

Trong cách đơn giản nhất có thể, làm thế nào tôi có thể kiểm tra xem một số nguyên được khởi tạo từ hàm scanf có phải là một số không?Kiểm tra xem một giá trị từ scanf có phải là một số không?

+1

Tôi tin rằng câu hỏi này trả lời câu hỏi của bạn. http://stackoverflow.com/questions/456303/how-to-validate-input-using-scanf – hometoast

+0

nếu số nguyên là một số không? –

+2

Tôi đọc câu hỏi là "nếu chuỗi đọc là số nguyên hợp lệ". – hometoast

Trả lời

8

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

Mở thành công, [scanf] trả về số các mặt hàng thành công đọc. Số lượng này có thể khớp với số lượng dự kiến ​​là số đọc hoặc ít hơn, thậm chí là 0, nếu xảy ra lỗi trùng khớp . Trong trường hợp của lỗi đầu vào trước khi bất kỳ dữ liệu nào có thể đọc thành công, EOF được trả về .

Vì vậy, bạn có thể làm một cái gì đó như thế này:

#include <stdio.h> 

int main() 
{ 
    int v; 
    if (scanf("%d", &v) == 1) { 
     printf("OK\n"); 
    } else { 
     printf("Not an integer.\n"); 
    } 
    return 0; 
} 

Nhưng nó được đề nghị bạn nên sử dụng fgetsstrtol để thay thế.

+0

Cảm ơn người đàn ông, nó hoạt động nhưng nếu tôi đặt điều này trong một vòng lặp, không hoạt động đúng, nếu đầu vào là một chuỗi lúc bắt đầu, vòng lặp là vô hạn, tôi có thể giải quyết? – genesisxyz

+0

Tôi đặt một getchar(); bên trong ... hoạt động bây giờ – genesisxyz

+1

'sscanf' và' scanf' là một ý tưởng tồi. Cả hai sản xuất hành vi không xác định trên tràn. – AnT

6

Câu hỏi của bạn được diễn đạt một cách kỳ lạ. Một số nguyên khởi tạo luôn luôn là một số (ngoài các trường hợp kỳ lạ của các đại diện bẫy), có nghĩa là không cần phải kiểm tra bất cứ điều gì.

Tôi đoán bạn cần kiểm tra xem chuỗi được cung cấp có phải là đại diện hợp lệ của một số hay không. Đối với điều đó, trước tiên bạn cần phải xác định những gì đại diện hợp lệ sẽ như thế nào. Bạn có cho phép đăng nhập không? Là một thừađược phép (như một dấu hiệu)? Điều gì về tiền tố 0x cho hệ thập lục phân? Và cứ thế.

Ngôn ngữ C cung cấp bộ quy tắc riêng để xác định ý tưởng của ngôn ngữ về biểu diễn chuỗi hợp lệ của số nguyên. Nếu đó là những gì bạn cần, thì để xác minh xem chuỗi đã thỏa mãn các quy tắc này, cách tốt nhất là sử dụng hàm chuyển đổi chuỗi thành số nguyên như strtol (và các hàm khác từ nhóm strto...) và sau đó kiểm tra điều kiện lỗi.

Hãy coi chừng các câu trả lời đề xuất viết chức năng của riêng bạn để xác minh các quy tắc này. Điều này không có ý nghĩa gì, vì hàm chuẩn đã tồn tại rồi. Ngoài ra, nói đúng, trong lập trình thực tế, hiếm khi cần phải thực hiện xác minh mà không cần chuyển đổi thực tế. strto... sẽ thực hiện cả hai.

Ngoài ra, hãy tránh xa các chức năng từ scanf nhóm để chuyển đổi chuỗi từ nguyên sang số nguyên. Các hàm này tạo ra hành vi không xác định trên tràn (tức là nếu biểu diễn chuỗi đầu vào quá dài). Trong trường hợp chung, cách thích hợp duy nhất để thực hiện chuyển đổi trong C là các hàm từ nhóm strto....