C 语言中,命令行参数(Command-Line Arguments)允许用户在执行程序时传递输入数据。C 语言通过 main(int argc, char *argv[]) 处理这些参数。

1、argcargv 的基本概念

C 语言中的 main 函数可以接受两个参数int main(int argc, char *argv[]),其中,argc(argument count)表示传递给程序的参数个数(包含程序本身的名称)。argv(argument vector)是一个 char* 数组,每个元素都是一个字符串,存储命令行输入的参数。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("参数个数: %d\n", argc);
    
    for (int i = 0; i < argc; i++) {
        printf("argv[%d]: %s\n", i, argv[i]);
    }

    return 0;
}

2、解析整数和浮点数参数

如果参数是数字,需要使用 atoiatofstrtol 进行转换。

#include <stdio.h>
#include <stdlib.h>  // 包含 atoi、atof

int main(int argc, char *argv[]) {
    if (argc < 3) {
        printf("用法: %s <整数> <浮点数>\n", argv[0]);
        return 1;
    }

    int num = atoi(argv[1]);       // 将字符串转换为整数
    double value = atof(argv[2]);  // 将字符串转换为浮点数

    printf("整数: %d\n", num);
    printf("浮点数: %lf\n", value);

    return 0;
}

3、解析带选项的命令行参数

如果命令行包含选项(flags),可以使用 strcmp() 解析选项。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int num = 0;
    char *str = NULL;

    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-n") == 0 && i + 1 < argc) {
            num = atoi(argv[i + 1]);
            i++;  // 跳过下一个参数
        } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) {
            str = argv[i + 1];
            i++;  // 跳过下一个参数
        }
    }

    printf("数字: %d\n", num);
    printf("字符串: %s\n", str ? str : "未提供");

    return 0;
}

4、使用 getopt() 解析选项

getopt() 是 POSIX 标准的选项解析函数,适用于复杂命令行参数。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>  // 包含 getopt

int main(int argc, char *argv[]) {
    int num = 0;
    char *str = NULL;
    int opt;

    while ((opt = getopt(argc, argv, "n:s:")) != -1) {
        switch (opt) {
            case 'n':
                num = atoi(optarg);
                break;
            case 's':
                str = optarg;
                break;
            default:
                fprintf(stderr, "用法: %s -n <数字> -s <字符串>\n", argv[0]);
                exit(EXIT_FAILURE);
        }
    }

    printf("数字: %d\n", num);
    printf("字符串: %s\n", str ? str : "未提供");

    return 0;
}

5、解析长选项(GNU getopt_long

getopt() 仅支持短选项(如 -n),如果要支持 --name 这种长选项,可以使用 getopt_long()(GNU 扩展)。

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int main(int argc, char *argv[]) {
    int num = 0;
    char *str = NULL;

    struct option long_options[] = {
        {"num", required_argument, NULL, 'n'},
        {"str", required_argument, NULL, 's'},
        {0, 0, 0, 0}
    };

    int opt;
    while ((opt = getopt_long(argc, argv, "n:s:", long_options, NULL)) != -1) {
        switch (opt) {
            case 'n':
                num = atoi(optarg);
                break;
            case 's':
                str = optarg;
                break;
            default:
                fprintf(stderr, "用法: %s --num <数字> --str <字符串>\n", argv[0]);
                exit(EXIT_FAILURE);
        }
    }

    printf("数字: %d\n", num);
    printf("字符串: %s\n", str ? str : "未提供");

    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表