C/C++

Command-line arguments in C/C++

Xin chào, bài viết này sẽ giới thiệu cách trup cập các arguments được truyền vào chương trình C/C++ khi nó được thực thi.


ARGC VÀ ARGV

Trong chương trình C/C++, khi function main() được gọi, nó sẽ được cung cấp hai đối số, thường được đặt tên là argc argv.

int main(int argc, char *argv[]) {…}

Trong đó, argc là một biến integer chứa số lượng command-line argument được truyền vào; argv là một mảng chứa các command-line arguments đó.

Example:

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("argc: %d\n", argc);

    for (int i = 0; i < argc; i++)
    	printf("argv[%d]: %s\n", i, argv[i]);

    return 0;
}

Compile and run:
$ gcc test.c -o test
$ ./test codelungtung.com 2019 C/C++_commandline_arguments

Output:
argc: 4
argv[0]: ./test
argv[1]: codelungtung.com
argv[2]: 2019
argv[3]: C/C++_commandline_arguments

Giải thích:
argc chứa số lượng command-line arguments được truyền vào chương trình, bao gồm cả tên chương trình được thực thi;
argc chứa 4 chuỗi ký tự là các đối số đã được truyền vào, trong đó đối số đầu tiên chính là tên của chương trình được thực thi.


ARGPARSE PHIÊN BẢN C++

Do mình sử dụng C++ và Python để giải quyết các bài toán Computer Vision (sử dụng OpenCV) nên rất cần có một bộ parser để xử lý các command-line arguments.

Nếu các bạn chưa biết, argparse là một module trong Python, giúp cho việc xử lý các command-line arguments trở nên dễ dàng, thuận tiện và hiệu quả hơn. Bên cạnh đó, GNU C library cung cấp hai bộ parser getopt và argp cho C/C++. Tuy nhiên, trong quá trình sử dụng, mình thấy rằng getopt và argp khá dài dòng, do đó mình quyết định viết một bộ parser cho C++ với API tương ứng với module argparse của Python, các bạn có thể clone từ Github của mình.

Cách sử dụng C++ argparse:

  • #include “argparse.h”
  • Tạo instance ArgumentParser:

ArgumentParser ap(int argc, char **argv, string descriptor)

Trong đó:
+ ap – một instance của class ArgumentParser;
+ argc, argv – là hai tham số tương ứng với chương trình chính;
+ descriptor – một string chứa mô tả về chương trình.

  • Thêm đối số (gồm keyword argument và non-keyword argument):

– Dùng cho positional argument:

ap.add_argument(string argName, string helpMessage) 

– Dùng cho optional argument:

ap.add_argument(string argName, string accessName, string defaultValue, string helpMessage)

Trong đó:
+ argName – là tên truy cập của positional argument; hoặc là short-name của optional argument (ví du: -i, -m, …);
+ accessName – là long-name của optinal argument (ví du: – -image, – -model, …) và là tên truy cập của optional argument;
+ defaultValue – giá trị mặc định của optional argument;
+ helpMessage – chứa mục đích sử dụng của argument.

  • Xử lý các đối số:

ap.parse_args()

  • Truy cập các đối số:

string ap.get(key)
int ap.get<int>(key)
float ap.get<float>(key)

Example:

#include <iostream>
#include <vector>
#include "argparse.h"

using namespace std;

int main(int argc, char* argv[]) {
	ArgumentParser ap(argc, argv, "Demo program");

	ap.add_argument("string", "string value");
	ap.add_argument("-i", "--integer", "0", "integer value");
	ap.add_argument("-f", "--float", "0.95", "float value");
	ap.parse_args();

	cout << "string value: " << ap.get("string") << endl;
	cout << "integer value: " << ap.get<int>("integer") << endl;
	cout << "float value: " << ap.get<float>("float") << endl;
	
	return 0;
}

Giải thích:
– Dòng 8: tạo instance của class ArgumentParser;
– Dòng 10: thêm positional argument “string”;
– Dòng 11, 12: thêm hai optional arguments “-i/ – -integer” và “-f/ – -float”;
– Dòng 13: xử lý các đối số đã thêm;
– Dòng 15-17: truy cập vào các đối số bởi key tương ứng (đã bỏ đi dấu – -).

Compile & run
$ g++ main.cpp argparse.cpp -o main
$ ./main -i 2019 codelungtung.com

Output:
string value: codelungtung.com
integer value: 2019
float value: 0.95

Sử dụng flag -h để in help message của chương trình:
$ ./main -h

Hình 1 – help message

Cảm ơn các bạn đã theo dõi bài viết của mình.
Thân ái và quyết thắng.

Hãy để lại comment nếu có câu hỏi!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s