Int argc, char * argv [] nghĩa là gì?

537
Greg Treleaven 2010-06-12 05:45.

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ó sẽ giống như sau:

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

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

int main()

mà 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?

8 answers

693
meagar 2010-06-12 05:47.

argvargclà cách các đối số dòng lệnh được chuyển đến main()trong C và C ++.

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

Các biến được đặt tên argc( số đối số ) và argv( vectơ đối số ) theo quy ước, nhưng chúng có thể được cung cấp cho bất kỳ số nhận dạng 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, nhường lại 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 <iostream>

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 c3sẽ xuất ra

Have 4 arguments:
./test
a1
b2
c3
53
John Boker 2010-06-12 05:47.

argclà số đố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ố khi 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
}
19
Toby Speight 2015-08-21 09:01.

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 mình là int main(int argc, char *argv[]), thì (trong hầu hết các môi trường), của bạn main()sẽ được gọi như sau:

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

Tuy nhiên, nếu bạn khai báo chính của mì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 chuyển.

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

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

Các tham số mainđại diện cho 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.

7
moshtagh 2015-07-21 22:28.

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

Tên chương trình luôn là đối số đầu tiên, vì vậy sẽ có ít nhất một đối số cho một chương trình và giá trị nhỏ nhất của argcsẽ là một. 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 mảng chuỗi một chiều của các đối số hàm.

5
adrian 2018-01-15 09:33.
int main();

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

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

Khai báo này được sử dụng khi chương trình của bạn phải nhận 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 Vectơ đối số, sẽ được điền bằng các con trỏ chuỗi tới "myprogram", "arg1", "arg2" và "arg3". Chương trình gọi ( 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 mà 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 nhập theo định dạng sau:

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ị nào trực tiếp trong các cuộc gọi tới system()! Đây là một lỗ hổng bảo mậ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, chỉ cần 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.

3
Nick Gerakines 2010-06-12 05:48.

Tham số đầu tiên là số đố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ố đó.

1
Chris Becke 2010-06-12 06:00.

Cả hai

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

là các định nghĩa pháp lý về điểm đầu vào cho một chương trình C hoặc C ++. Stroustrup: Câu hỏi thường gặp về phong cách và kỹ thuật C ++ nêu chi tiết một số biến thể có thể hoặc hợp pháp cho chức năng chính của bạn.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Làm thế nào để xây dựng một quả địa cầu từ Scratch

Làm thế nào để xây dựng một quả địa cầu từ Scratch

Thời gian, sự kiên nhẫn, thời gian, sự cống hiến và thời gian chỉ là một vài trong số những thứ mà Peter Bellerby cần để thành lập và sau đó điều hành Bellerby & Co. Globemakers, một trong những công ty duy nhất trên Trái đất vẫn sản xuất các quả địa cầu bằng tay.

Năm giai đoạn đau buồn sau khi mất việc làm

Năm giai đoạn đau buồn sau khi mất việc làm

Đó là một ngày thứ Bảy, máy bay của tôi hạ cánh, và tôi đã sẵn sàng để thư giãn trong một kỳ nghỉ cuối tuần ngắn ngủi, khi một email đến trên điện thoại của tôi. Tôi đã mất việc.

Giữ an toàn cho danh tính của bạn với một cảnh báo đóng băng hoặc gian lận tín dụng

Giữ an toàn cho danh tính của bạn với một cảnh báo đóng băng hoặc gian lận tín dụng

Nếu bạn đã từng bị đánh cắp danh tính của mình, bạn biết đó là một trải nghiệm đáng sợ và căng thẳng. Một cách không phổ biến để ngăn chặn nó? Tín dụng bị đóng băng.

Buổi ra mắt phần 3 của The Good Place có một học sinh mới: Khán giả

Buổi ra mắt phần 3 của The Good Place có một học sinh mới: Khán giả

Eleanor (Kristen Bell) dường như đã tình nguyện cho chúng tôi làm vật tưởng nhớ. NBC's The Good Place là một chương trình thích thử thách tốt.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language