【问题标题】:What are the advantages of command line arguments in C? [closed]C 中命令行参数的优点是什么? [关闭]
【发布时间】:2020-11-28 09:22:23
【问题描述】:
int main(int argc, char *argv[]) {


}

我知道 argc 是在命令行中传递的命令数,而在 char *argv 中是参数本身。什么是命令行参数的最佳使用,而不是程序本身的硬编​​码?

【问题讨论】:

  • 嗯,很明显,它允许您将信息传递到main() 以配置代码的启动,例如传递要打开的文件名或更改代码行为方式的选项。永远不要硬编码数字或文件名(除非它是不变的配置文件)。想象一下必须重新编译代码才能从不同的数据文件中读取数据?
  • 如果你接受来自命令行的输入,信息将通过argv[index]访问的命令行参数传递,因此你的程序将在每次调用或显示帮助时使用不同的信息,为用户提供多样性选项,保持它的灵活性和动态性是好的,这就是 Linux 世界中程序设计的方式。如果您对参数进行硬编码,它们就会变成变量 :),并且您不允许将任何信息动态传递给您的程序。
  • 这似乎是一个简单的谷歌搜索可以解决的明显问题。我闻到了阴谋的味道。
  • 你不妨问:“使用计算机程序有什么好处?”。

标签: c command-line


【解决方案1】:

想想 *nix 命令行环境中的lscpmv 之类的命令行工具(MS 命令行环境中的dircopymoverename)。当然,您可以让每个程序都要求输入提示:

$ cp
> source file name: foo.c
> target file name: bar.c

在交互式会话中起作用,但在脚本或批处理会话中不起作用,例如

for file in *.c *.h
do
  cp $file backups/$file.bak
done

即使在交互式会话中,也只是 更快 吹嘘

$ cp foo.c bar.c

而不是等待提示。它还可以更轻松地处理可变数量的参数,例如

$ cp *.c *.h src

将所有源文件和头文件复制到src 子目录。

这不是 C 独有的 - 几乎所有编程语言都有一些直接从运行时环境接收参数的方式(从命令行或其他机制)。

【讨论】:

    【解决方案2】:

    假设你有一个命令行file_matcher 程序,你打算如何使用它?好吧,您必须将文件名传递给要匹配的程序。您不能对它们进行硬编码(意味着您不能在代码文件中写入文件名)。因为如果您对它们进行硬编码,那么您每次都必须更改程序代码中的文件名,如果由于任何原因文件名更改或您想测试新文件。

    不管怎样,我给出了一段我很久以前写的代码来匹配两个文件。玩它。并运行它调用它(假设两个文件file_1.txtfile_2.txt 与file_matcher 在同一个目录中):

    > file_matcher file_1.txt file_2.txt
    

    还有file_matcher.c:

    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    
    
    char *get_charname(int ch) {
        if(ch == 0) return "Null";
        if(isspace(ch)) return "White space";
        if(iscntrl(ch)) return "Control Key";
        return "Others";
    }
    
    int main(int argc, char *argv[]) {
        FILE *f1, *f2;
        char ch1, ch2;
        int row, col;
        
        if(argc != 3) {
            if(argc == 1) printf("Missing file names\n");
            else if(argc == 2) printf("Missing a file name\n");
            else printf("Too many files\n");
            exit(1);
        }
    
        f1 = fopen(argv[1], "r");
        if(f1 == NULL) {
            printf("Error opening \"%s\"\n", argv[1]);
            exit(1);
        }
        f2 = fopen(argv[2], "r");
        if(f2 == NULL) {
            printf("Error opening \"%s\"\n", argv[2]);
            fclose(f1);
            exit(1);
        }
        
        row = 1;
        col = 1;
        while(fscanf(f1, "%c", &ch1) != EOF) {
            if(fscanf(f2, "%c", &ch2) == EOF) {
                printf("Too less data in \"%s\"\n", argv[2]);
                printf("Matching stopped at (row, col): (%d, %d)\n", row, col);
                fclose(f1);
                fclose(f2);
                exit(1);
            }
            
            if(ch1 != ch2) {
                printf("Miss match at (row, col): (%d, %d)\n", row, col);
                
                if(isgraph(ch1)) printf("In \"%s\" found '%c'(ascii value: %d)\n", argv[1], ch1, ch1);
                else printf("In \"%s\" found '%s'(ascii value: %d)\n", argv[1], get_charname(ch1), ch1);
                
                if(isgraph(ch2)) printf("In \"%s\" found '%c'(ascii value: %d)\n", argv[2], ch2, ch2);
                else printf("In \"%s\" found '%s'(ascii value: %d)\n", argv[2], get_charname(ch2), ch2);
                
                fclose(f1);
                fclose(f2);
                exit(1);
            }
            
            if(ch1 == '\n') {
                row++;
                col = 1;
            }
            else col++;
        }
        if(fscanf(f2, "%c", &ch2) != EOF) {
            printf("Too much data in \"%s\"\n", argv[2]);
            printf("Matching stopped at (row, col): (%d, %d)\n", row, col);
            fclose(f1);
            fclose(f2);
            exit(1);
        }
        
        printf("\"%s\" and \"%s\" matched succesfully\n", argv[1], argv[2]);
        
        fclose(f1);
        fclose(f2);
        
        return 0;
    }
    

    就像这个程序一样,许多其他程序都被设计为从命令行获取输入...

    我希望,现在你明白这背后的原因了....

    【讨论】:

    • 这个答案有点夸张。您不能只传入几个 ints 并执行一个 for 循环来显示它如何改变程序的行为吗?
    • @Andy,实际上我想让 OP 对一些真正有用的应用程序感兴趣......因为,一些普通的例子不会像这个例子那样产生效果......除了(s)他可能已经知道如何使用命令行参数...
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 2022-01-21
    • 1970-01-01
    • 2014-04-12
    • 2020-03-07
    • 2010-10-26
    相关资源
    最近更新 更多