📜  C-命令行参数(1)

📅  最后修改于: 2023-12-03 14:59:52.554000             🧑  作者: Mango

C命令行参数

在编写C程序时,命令行参数是非常常见的。命令行参数是在执行可执行程序时传递给程序的参数。这些参数可以是文件名、选项标志、标志值等。

获取命令行参数

可以使用main函数中的argc和argv参数来获取命令行参数。

  • argc (argument count) 表示命令行参数的总数,包括可执行文件本身。
  • argv (argument vector) 是一个指针数组,其中每个元素是一个指向参数字符串的指针。

示例代码:

int main(int argc, char *argv[]) {
    printf("There are %d arguments\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("%s\n", argv[i]);
    }
    return 0;
}

运行命令./program arg1 arg2 arg3,输出:

There are 4 arguments
./program
arg1
arg2
arg3
选项参数

选项参数是用来改变程序运行方式的参数。选项参数通常以单个破折号-或双破折号--开始,后面跟着一个字母或字符串。

可以使用getopt函数来解析选项参数。getopt函数使用简单的状态机来处理命令行参数:

  • 转移到下一个选项参数。
  • 获取参数值。
  • 返回-1表示处理完毕。

示例代码:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int opt;
    char *output = "default.out";
    while ((opt = getopt(argc, argv, "o:")) != -1) {
        switch (opt) {
            case 'o':
                output = optarg;
                break;
            default:
                fprintf(stderr, "Usage: %s [-o output_file] input_file\n", argv[0]);
                return 1;
        }
    }
    if (optind >= argc) {
        fprintf(stderr, "Expected input file\n");
        return 1;
    }
    char *input = argv[optind];
    printf("Input file: %s\nOutput file: %s\n", input, output);
    return 0;
}

运行命令./program -o output.txt input.txt,输出:

Input file: input.txt
Output file: output.txt
命令行参数的内存管理

需要注意的是,字符串参数通常是指向命令行参数的指针。这意味着这些参数可能已经存储在堆栈中,无法修改。因此,如果需要修改命令行参数,则需要将它们复制到堆中。

示例代码:

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

int main(int argc, char *argv[]) {
    char *name = strdup(argv[1]);
    printf("Hello, %s!\n", name);
    free(name);
    return 0;
}

运行命令./program Alice,输出:

Hello, Alice!
总结

命令行参数是在执行可执行程序时传递给程序的参数。可以使用main函数中的argc和argv参数来获取命令行参数,或者使用getopt函数来解析选项参数。需要注意命令行参数的内存管理,以避免出现问题。