Khái niệm
Chương trình C nhận tham số từ dòng lệnh khi chạy. main() có 2 tham số đặc biệt:
argc(argument count): Số lượng tham số (kể cả tên chương trình)argv(argument vector): Mảng con trỏ chuỗi,argv[0]= tên chương trình
Cú pháp main chuẩn
int main(int argc, char *argv[]) {
// hoặc
int main(int argc, char **argv) {
Ví dụ chạy
$ ./tinh_toan 10 5 +
argc = 4
argv[0] = "./tinh_toan"
argv[1] = "10"
argv[2] = "5"
argv[3] = "+"
argv[4] = NULL // Kết thúc mảng
Chương trình 1: In tất cả tham số
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("So tham so: %d\n", argc);
printf("Ten chuong trinh: %s\n", argv[0]);
printf("Cac tham so:\n");
for (int i = 1; i < argc; i++) {
printf(" argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
Kết quả
$ ./demo hello world 123
So tham so: 4
Ten chuong trinh: ./demo
Cac tham so:
argv[1] = hello
argv[2] = world
argv[3] = 123
Chương trình 2: Máy tính đơn giản từ dòng lệnh
#include <stdio.h>
#include <stdlib.h> // atof, atoi
int main(int argc, char *argv[]) {
if (argc != 4) {
printf("Cach dung: %s \n", argv[0]);
printf("Phep toan: + - * /\n");
return 1;
}
double a = atof(argv[1]);
char op = argv[2][0];
double b = atof(argv[3]);
double kq;
switch (op) {
case '+': kq = a + b; break;
case '-': kq = a - b; break;
case '*': kq = a * b; break;
case '/':
if (b == 0) {
printf("Loi: Chia cho 0!\n");
return 1;
}
kq = a / b;
break;
default:
printf("Phep toan khong hop le: %c\n", op);
return 1;
}
printf("Ket qua: %.2f %c %.2f = %.2f\n", a, op, b, kq);
return 0;
}
Kết quả
$ ./calc 10 + 5
Ket qua: 10.00 + 5.00 = 15.00
$ ./calc 7.5 / 2.5
Ket qua: 7.50 / 2.50 = 3.00
$ ./calc 10
Cach dung: ./calc
Phep toan: + - * /
Chuyển đổi chuỗi sang số
| Hàm | Header | Chuyển đổi | Lưu ý |
|---|---|---|---|
atoi(s) | stdlib.h | String → int | Không báo lỗi, "abc" → 0 |
atol(s) | stdlib.h | String → long | Không báo lỗi |
atof(s) | stdlib.h | String → double | Không báo lỗi |
strtol(s, &end, base) | stdlib.h | String → long | Có báo lỗi qua endptr, base 2-36 |
strtod(s, &end) | stdlib.h | String → double | Có báo lỗi |
Ứng dụng thực tế
- CLI tools:
gcc -o out main.c,ls -la,grep -r "pattern" . - Cấu hình chương trình không cần recompile
- Truyền file input/output:
./app input.txt output.txt - Daemon/service nhận config từ command line
- Script automation, CI/CD pipeline
Thư viện phân tích tham số nâng cao
getopt()(POSIX): Short options-a -b valuegetopt_long()(GNU): Long options--help --version- Thư viện bên thứ 3:
argp,CLI11(C++),cargs
Ví dụ getopt()
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
int verbose = 0;
char *output = NULL;
while ((opt = getopt(argc, argv, "vo:")) != -1) {
switch (opt) {
case 'v': verbose = 1; break;
case 'o': output = optarg; break;
case '?': return 1; // Lỗi option không hợp lệ
}
}
printf("Verbose: %d\n", verbose);
printf("Output file: %s\n", output ? output : "(stdout)");
// Các tham số còn lại (non-option)
for (int i = optind; i < argc; i++) {
printf("Extra arg: %s\n", argv[i]);
}
return 0;
}
Tham số dòng lệnh là cách chuẩn để cấu hình chương trình C, tách biệt code và data, phù hợp Unix philosophy.