Argc argv C là gì

Hỏi:

Trong nhiều trình biên dịch và IDE của C ++, khi nó tạo ra hàm chính cho bạn, nó trông như thế này:

int main(int argc, char *argv[])

Khi tôi mã C ++ mà không có IDE, chỉ với trình biên dịch dòng lệnh, tôi gõ:

int main()

không có bất kỳ tham số nào. Điều này có nghĩa là gì, và nó có quan trọng đối với chương trình của tôi không?

Xem thêm:

Trả lời:

argvvà argclà cách các đối số dòng lệnh được truyền vào main()trong C và C ++.

argcsẽ là số chuỗi được trỏ bởi argv. Điều này sẽ (trong thực tế) là 1 cộng với số lượng đối số, vì hầu như tất cả các cài đặt sẽ thêm tên của chương trình vào mảng.

Các biến được đặt tên argc( đếm đối số ) và argv( vectơ đối số ) theo quy ước, nhưng chúng có thể được cung cấp bất kỳ định danh hợp lệ nào: int main(int num_args, char** arg_strings)có giá trị như nhau.

Chúng cũng có thể được bỏ qua hoàn toàn, cho năng suất int main(), nếu bạn không có ý định xử lý các đối số dòng lệnh.

Hãy thử chương trình sau:

#include int main(int argc, char** argv) { std::cout << "Have " << argc << " arguments:" << std::endl; for (int i = 0; i < argc; ++i) { std::cout << argv[i] << std::endl; } }

Chạy nó với ./test a1 b2 c3đầu ra sẽ

Have 4 arguments: ./test a1 b2 c3

Trả lời:

argclà số lượng đối số được truyền vào chương trình của bạn từ dòng lệnh và argvlà mảng đối số.

Bạn có thể lặp qua các đối số biết số lượng của chúng như:

for(int i = 0; i < argc; i++) { // argv[i] is the argument at index i }

Trả lời:

Giả sử bạn chạy chương trình của mình như vậy (sử dụng shcú pháp):

myprog arg1 arg2 'arg 3'

Nếu bạn đã khai báo chính của bạn là int main(int argc, char *argv[]), thì (trong hầu hết các môi trường), bạn main()sẽ được gọi như thể:

p = { "myprog", "arg1", "arg2", "arg 3", NULL }; exit(main(4, p));

Tuy nhiên, nếu bạn khai báo chính là int main(), nó sẽ được gọi là

exit(main());

và bạn không nhận được các đối số được thông qua.

Hai điều bổ sung cần lưu ý:

  1. Đây là hai chữ ký duy nhất được ủy quyền cho main. Nếu một nền tảng cụ thể chấp nhận các đối số bổ sung hoặc loại trả về khác, thì đó là một tiện ích mở rộng và không nên dựa vào trong một chương trình di động.
  2. *argv[]và **argvhoàn toàn tương đương, vì vậy bạn có thể viết int main(int argc, char *argv[])như int main(int argc, char **argv).

Trả lời:

Các tham số để mainbiểu diễn các tham số dòng lệnh được cung cấp cho chương trình khi nó được khởi động. Các argctham số đại diện cho số của đối số dòng lệnh, và char *argv[]là một mảng của chuỗi (con trỏ ký tự) đại diện cho các đối số cá nhân được cung cấp trên dòng lệnh.

Trả lời:

Các mainchức năng có thể có hai tham số, argcvà argv. argclà một tham số nguyên ( int) và nó là số lượng đối số được truyền cho chương trình.

Tên chương trình luôn là đối số đầu tiên, do đó sẽ có ít nhất một đối số cho một chương trình và giá trị tối thiểu argcsẽ là một đối số. Nhưng nếu một chương trình có hai đối số thì giá trị của argcsẽ là ba.

Tham số argvtrỏ đến một mảng chuỗi và được gọi là vectơ đối số . Nó là một chuỗi chuỗi một chiều của các đối số hàm.

Trả lời:

int main();

Đây là một tuyên bố đơn giản. Nó không thể lấy bất kỳ đối số dòng lệnh.

int main(int argc, char* argv[]);

Tuyên bố này được sử dụng khi chương trình của bạn phải lấy các đối số dòng lệnh. Khi chạy như vậy:

myprogram arg1 arg2 arg3

argc, hoặc Số lượng đối số, sẽ được đặt thành 4 (bốn đối số) và argv, hoặc Đối số vectơ, sẽ được điền với các con trỏ chuỗi thành "myprogram", "arg1", "arg2" và "arg3". Lệnh gọi chương trình ( myprogram) được bao gồm trong các đối số!

Ngoài ra, bạn có thể sử dụng:

int main(int argc, char** argv);

Điều này cũng hợp lệ.

Có một tham số khác bạn có thể thêm:

int main (int argc, char *argv[], char *envp[])

Các envpthông số còn chứa các biến môi trường. Mỗi mục theo định dạng này:

VARIABLENAME=VariableValue

như thế này:

SHELL=/bin/bash

Danh sách các biến môi trường được kết thúc bằng null.

QUAN TRỌNG: KHÔNG sử dụng bất kỳ argvhoặc envpgiá trị trực tiếp trong các cuộc gọi đến system()! Đây là một lỗ hổng bảo mật rất lớn vì người dùng độc hại có thể đặt các biến môi trường thành các lệnh dòng lệnh và (có khả năng) gây ra thiệt hại lớn. Nói chung, không sử dụng system(). Hầu như luôn luôn có một giải pháp tốt hơn được thực hiện thông qua các thư viện C.

Trả lời:

Tham số đầu tiên là số lượng đối số được cung cấp và tham số thứ hai là danh sách các chuỗi đại diện cho các đối số đó.

Trả lời: