2011-10-24 29 views
10

Tôi có một chương trình có thể chấp nhận các đối số dòng lệnh và tôi muốn truy cập các đối số, được nhập bởi người dùng, từ một hàm. Làm thế nào tôi có thể vượt qua *argv[], từ int main(int argc, char *argv[]) đến chức năng đó? Tôi là người mới với khái niệm về con trỏ và *argv[] trông hơi quá phức tạp để tôi tự làm việc này.Làm thế nào tôi có thể chuyển * argv [] của chính vào một hàm?

Ý tưởng là để lại main của tôi càng sạch càng tốt bằng cách di chuyển tất cả công việc, mà tôi muốn làm với các đối số, vào một tệp thư viện. Tôi đã biết những gì tôi phải làm với những lý lẽ đó khi tôi quản lý để giữ chúng bên ngoài main. Tôi chỉ không biết làm thế nào để có được chúng ở đó.

Tôi đang sử dụng GCC. Cảm ơn trước.

Trả lời

23

Chỉ cần viết một hàm như

void parse_cmdline(int argc, char *argv[]) 
{ 
    // whatever you want 
} 

và gọi đó là trong main như parse_cmdline(argc, argv) . Không có ma thuật liên quan.

Trong thực tế, bạn không thực sự cần phải vượt qua argc, vì thành viên cuối cùng của argv được đảm bảo là một con trỏ rỗng. Nhưng kể từ khi bạn có argc, bạn cũng có thể vượt qua nó.

Nếu chức năng không cần biết về tên chương trình, bạn cũng có thể quyết định gọi nó như

parse_cmdline(argc - 1, argv + 1); 
+2

gì về khi argv được định nghĩa là const char * argv []? Đó là cách OS X, và tôi không thể thay đổi chính xác ABI của Apple ... – MarcusJ

+1

@MarcusJ Yeah - ARC không cản trở điều đó trong XCode trên OSX. Tôi đã phải chuyển chúng vào phương thức lớp ObjC++ của tôi như 'getParams (argc, argv)', nhưng sau đó phải khai báo hàm đó như 'static std :: map getParams (int argc, const char ** argv) 'Lưu ý' ** argv'. Sau đó, bên trong phương thức lớp, tôi có thể sử dụng 'argv' như bình thường như thể nó nằm trong hàm' main'. (Công cụ 'map' trên kết quả trả về là vì hàm của tôi đã chuyển đổi các biến thành các cặp ánh xạ key = value. Không phải là bạn cũng có thể làm điều đó.) – Volomike

0

Chỉ cần vượt qua argcargv vào chức năng của bạn.

0
SomeResultType ParseArgs(size_t count, char** args) { 
    // parse 'em 
} 

Hoặc ...

SomeResultType ParseArgs(size_t count, char* args[]) { 
    // parse 'em 
} 

Và sau đó ...

int main(int size_t argc, char* argv[]) { 
    ParseArgs(argv); 
} 
Các vấn đề liên quan