Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Tham số dòng lệnh (Command Line Arguments) trong C

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.hString → intKhông báo lỗi, "abc" → 0
atol(s)stdlib.hString → longKhông báo lỗi
atof(s)stdlib.hString → doubleKhông báo lỗi
strtol(s, &end, base)stdlib.hString → longCó báo lỗi qua endptr, base 2-36
strtod(s, &end)stdlib.hString → doubleCó 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 value
  • getopt_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.