2011-02-09 47 views
5

Tôi có một loại máy tính trong C++ nên chấp nhận đối số khi được thực thi. Tuy nhiên, khi tôi nhập 7 làm đối số, nó có thể xuất hiện là 10354 khi được đưa vào một biến. Đây là mã của tôi:đối số nguyên cho c + +

#include "stdafx.h" 
#include <iostream> 

int main(int argc, int argv[]) 
{ 
    using namespace std; 
    int a; 
    int b; 
    if(argc==3){ 
     a=argv[1]; 
     b=argv[2]; 
    } 
    else{ 
     cout << "Please enter a number:"; 
     cin >> a; 
     cout << "Please enter another number:"; 
     cin >> b; 
    } 
    cout << "Addition:" << a+b << endl; 
    cout << "Subtaction:" << a-b << endl; 
    cout << "Multiplycation:" << a*b << endl; 
    cout << "Division:" << static_cast<long double>(a)/b << endl; 
    system("pause"); 
    return 0; 
} 
+0

Luôn biên dịch mã của bạn khi bật cảnh báo tối đa. '-Wall' khi sử dụng gcc. Tôi nghi ngờ trình biên dịch có thể đã ngăn cản bạn làm sai lầm này với một cảnh báo về việc chuyển đổi một con trỏ thành một số nguyên. –

+0

@deft_code? Trường hợp chuyển đổi từ con trỏ sang số nguyên? 'main' chỉ có chữ ký kiểu sai. –

+0

FYI, hầu hết các nhà toán học yêu cầu kiểm tra mẫu số bằng 0 trước khi chia. Tôi nghe nói nó là bất hợp pháp. Tôi tin rằng thuật ngữ lập trình là "Hành vi không xác định". Chương trình sẽ tạo ra một tín hiệu hoặc ngoại lệ. Thế giới có thể sụp đổ. Ai biết? –

Trả lời

19

Bất cứ nơi nào bạn nhận được int argv[]? Đối số thứ hai cho mainchar* argv[].

Bạn có thể chuyển đổi các đối số dòng lệnh này từ chuỗi thành số nguyên bằng cách sử dụng atoi hoặc strtod.

Ví dụ:

a=atoi(argv[1]); 
    b=atoi(argv[2]); 

Nhưng bạn không thể chỉ thay đổi kiểu tham số, bởi vì hệ điều hành sẽ cung cấp cho bạn đối số dòng lệnh của bạn trong chuỗi hình thức cho dù bạn có thích hay không.

LƯU Ý: Bạn phải #include <stdlib.h> (hoặc #include <cstdlib>using std::atoi;) để sử dụng chức năng atoi.


Nếu bạn muốn kiểm tra lỗi, hãy sử dụng strtol thay vì atoi. Sử dụng nó gần như là dễ dàng, và nó cũng cung cấp cho bạn một con trỏ đến vị trí trong chuỗi nơi phân tích cú pháp chấm dứt. Nếu điều đó trỏ đến việc chấm dứt NUL, việc phân tích cú pháp đã thành công. Và tất nhiên nó là tốt mà bạn xác minh argc để đảm bảo rằng người dùng cung cấp đủ thông số, và tránh cố gắng để đọc các thông số còn thiếu từ argv.

+0

Một phương pháp khác để chuyển đổi từ chuỗi thành số nguyên là sử dụng 'std :: istringstream'. –

+1

@Thomas: Nếu bạn cần xử lý hàng nghìn dấu tách và ký hiệu tiền tệ và nội dung, vâng. Nếu không, nó chỉ gấp 5 lần mã và chậm hơn 20 lần. –

+0

Lý do cho downvote? –

2

Đối số thứ hai trong chính phải là char* argv[] hoặc char** argv. Sau đó, bạn phải chuyển đổi chúng thành int.

4

Chữ ký chức năng là int main(int argc, char *argv[]). argv là một mảng các con trỏ chuỗi.

Nếu đối số là 7, nó sẽ ở dạng một chuỗi ("7"). Sử dụng atoi() để chuyển đổi số đó thành số 7.

+0

Cảm ơn. Tôi không biết về chức năng đó. Khi tôi sử dụng static_cast và các đối số int argc, và char * argv [], nó sẽ dẫn đến lỗi. – Rob

+0

@Rob: Nếu bạn đang truyền char * đến int, vui lòng trình biên dịch của bạn sẽ không cho phép nó. Nếu bạn có thể biên dịch nó, bạn sẽ có một chương trình với một lỗi nghiêm trọng. Chuỗi là một mảng các ký tự. Giá trị của ký tự '7' không phải là 7. Nếu bạn muốn thực hiện toán học với 7, bạn phải chuyển đổi chuỗi. –

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