2011-07-18 26 views
10

Tôi là người mới đến C++ đến từ nền python.cách khai báo biến trước khi bạn biết loại dữ liệu đó là gì?

Nếu tôi muốn đầu vào từ người dùng và sau đó tôi muốn kiểm tra kiểu dữ liệu đầu vào là gì (ví dụ: số nguyên hoặc float), tôi có thể khai báo biến mà tôi muốn gán đầu vào của người dùng như thế nào?

+0

Tôi nghĩ rằng những gì bạn có thể cần chỉ là một phao hoặc một đôi. Họ có thể giữ số nguyên cũng như số phân số. –

Trả lời

22

Câu trả lời ngắn: Bạn không có thể.

Câu trả lời dài: Bạn không thể. C++ là một ngôn ngữ được gõ tĩnh, có nghĩa là bạn phải định nghĩa kiểu tại thời gian biên dịch. Python được nhập động, vì vậy loại đối tượng có thể thay đổi từ dòng này sang dòng khác.

Nếu bạn muốn nhận một số đầu vào từ người dùng, bạn chỉ có thể sử dụng chuỗi.

Ví dụ, nếu bạn muốn nhận được số nguyên đầu vào từ người sử dụng:

int n; 
std::cin >> n; 

nổi đầu vào:

float x; 
std::cin >> x; 

Và vân vân. Do lưu ý trong hai trường hợp, nếu người dùng nhập vào một cái gì đó khác với một số nguyên hoặc phao, bạn sẽ phải kiểm tra cờ của std :: cin để xem nếu có một lỗi.

Nhưng bạn cần phải thông báo cho người dùng "Nhập số nguyên ngay bây giờ" hoặc "Nhập float ngay bây giờ". Bạn không thể chấp nhận một số loại tùy ý. Thay vào đó, hãy thiết kế mã của bạn để bạn có các đường dẫn mã thay thế cho đầu vào số nguyên hoặc dấu phẩy động. Hoặc buộc một hay cái kia, và in ra một lỗi khi chúng đưa ra loại đầu vào sai.

Không viết mã của bạn như bạn đang sử dụng Python. Mã Python thành ngữ không phải là mã C++ thành ngữ và cách bạn hoàn thành mọi thứ sẽ không giống nhau.

Trong C++ cách để có được đầu vào tùy ý sẽ trông như thế:

std::string input; 
std::cin >> input; 

if (IsInteger(input)) 
{ 
    // do stuff with integer 
} 

else if (IsFloat(input)) 
{ 
    // do stuff with float 
} 

else 
{ 
    std::cout << "Bad Input!" << std::endl; 
} 

Edit: Theo MSalters chỉ ra trong một chú thích, Bạn thực sự có thể sử dụng boost::lexical_cast<T>(expr) để đúc một chuỗi đại diện cho một số loại T (Trường hợp T thường là một cái gì đó như int, float, double, vv). Lưu ý, có thể bạn vẫn phải thực hiện một số kiểm tra để xem liệu expr có thực sự là một số nguyên, float hay không.

+1

+1 cho mã Python Idiomatic không phải là mã C++ thành ngữ – Mark

5

Khi bạn nhận dữ liệu nhập từ người dùng, nó sẽ đến dưới dạng string. Ví dụ:

std::string inp; 
std::cin >> inp; 

Sau đó, bạn lấy nội dung của inp (đó là những gì người dùng gõ), và nhìn vào bên trong nó để xem những gì nhân vật nó chứa. Tại thời điểm đó bạn có thể đưa ra quyết định dựa trên việc nó có chứa (a) tất cả các chữ số, (b) chữ số và dấu thập phân hay (c) cái gì khác hoàn toàn.

+0

Khá một vài miền địa phương sử dụng ',' làm dấu tách thập phân. Những người khác sử dụng nó như một dấu phân cách hàng ngàn. Quốc tế hóa là khó. –

+2

'boost :: lexical_cast (inp)' sẽ sử dụng ngôn ngữ hiện tại. Không phải là khó, thực sự, phần khó nhất là đối phó với những người dùng trong thế giới thực đang trộn chúng. – MSalters

3

Tốt hơn nên thu thập chuỗi từ người dùng và sau đó phân tích cú pháp.

Câu hỏi này là nơi để tìm kiếm một câu trả lời: How to parse an int from a string

1

C++ là ngôn ngữ được nhập tĩnh. Tất cả các loại biến phải được biết tại thời gian biên dịch.

1

Python là ngôn ngữ được nhập động và ngược lại, c/C++ là các ngôn ngữ được nhập tĩnh. Không thể tìm thấy loại và khai báo vào thời gian chạy.

Các vấn đề liên quan