getopt() là hàm chuẩn POSIX (header <unistd.h>) giúp phân tích (parse) các tùy chọn dòng lệnh (command-line options) một cách có hệ thống, hỗ trợ cả tùy chọn có đối số và không có đối số.
Chữ ký hàm
int getopt(int argc, char *const argv[], const char *optstring);
Tham số optstring
- Chuỗi chứa các ký tự tùy chọn hợp lệ.
- Ký tự theo sau
':'→ tùy chọn bắt buộc có đối số (ví dụ:"f:"nghĩa là-f filename). - Ký tự theo sau
'::'(GNU extension) → tùy chọn có đối số tùy chọn. - Nếu
optstringbắt đầu bằng':'→ phân biệt lỗi "thiếu đối số" (trả về':') và "tùy chọn không hợp lệ" (trả về'?').
Biến toàn cục quan trọng
| Biến | Ý nghĩa |
|---|---|
optarg | Con trỏ đến đối số của tùy chọn hiện tại (nếu có). |
optind | Chỉ số phần tử tiếp theo trong argv sẽ được xử lý (dùng để lấy positional arguments sau các option). |
optopt | Ký tự tùy chọn gây lỗi (khi trả về '?'). |
opterr | Nếu = 0, tắt thông báo lỗi mặc định của getopt. |
Giá trị trả về
- Ký tự tùy chọn (ví dụ:
'f') nếu thành công. ':'— tùy chọn thiếu đối số (chỉ khioptstringbắt đầu bằng':').'?'— tùy chọn không nhận diện.-1— không còn tùy chọn nào.
Ví dụ hoàn chỉnh
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
// ':' đầu tiên: bật chế độ phân biệt lỗi thiếu đối số
// "if:lrx" → -i, -l, -r, -x không có đối số; -f CÓ đối số
while ((opt = getopt(argc, argv, ":if:lrx")) != -1) {
switch (opt) {
case 'i': case 'l': case 'r': case 'x':
printf("Tuy chon: -%c\n", opt);
break;
case 'f':
printf("Tuy chon -f voi doi so: %s\n", optarg);
break;
case ':':
printf("Loi: Tuy chon -%c can doi so!\n", optopt);
break;
case '?':
printf("Loi: Tuy chon khong hop le: -%c\n", optopt);
break;
}
}
// Xử lý các positional arguments (không phải option)
for (; optind < argc; optind++) {
printf("Tham so them: %s\n", argv[optind]);
}
return 0;
}
Chạy thử
$ ./a.out -i -f test.txt -l -r hello
Tuy chon: -i
Tuy chon -f voi doi so: test.txt
Tuy chon: -l
Tuy chon: -r
Tham so them: hello
Mẹo & Lưu ý
getopttự động sắp xếp lạiargv(option trước, non-option sau) — hành vi GNU mặc định. DùngPOSIXLY_CORRECTenv var để tắt.- Để reset parse (dùng cho subcommand), gán
optind = 1. getopt_long()(GNU) hỗ trợ long option (--help, --version).- Trên Windows (MSVC),
getoptkhông có sẵn — cần triển khai riêng hoặc dùng thư viện nhưgetopt_port.
getopt() là công cụ chuẩn, nhẹ, không phụ thuộc thư viện ngoài — lý tưởng cho CLI tool C/C++ đơn giản.