C中命令行的多个输入参数

时间:2013-08-13 11:25:17

标签: c command-line-arguments

我正在尝试在运行已编译的C代码时传递多个参数

代码就像这样

void main(char argc,char *argv[]){

    printf("%s",argv[1])    //filename
    FILE *file = fopen(argv[1], "r")

    printf("%s",argv[2])    //function to be called
    char* func_name = argv[2];

    printf("%s",argv[3])    //how many times the function is called
    int repeat = argv[3];

    for(int i=0;i<repeat;i++){
        func_name(file) //calls some function and passes the file to it 
    }

}

我会像这样编译

gcc cprog.c -o cprog

像 -

一样跑
./cprog textfile.txt function1 4 

我该怎么做?任何帮助,将不胜感激 !

3 个答案:

答案 0 :(得分:1)

为了能够将您拥有的函数作为字符串调用,您已知道哪个名称与哪个函数配对。

如果所有函数都使用相同的参数,则可以使用带有名称和函数指针的结构数组,然后将该名称与表中的正确条目匹配。

否则,如果参数不同,则必须有一串strcmp次调用来调用正确的函数。

答案 1 :(得分:1)

这里有很多错误。

int repeat = argv[3]; //You must convert char* to int before assignment.
func_name(file)       //func_name is a char* not a function. C does not support reflection so there is no way to call function like this.

答案 2 :(得分:1)

首先关闭:

  1. 你缺少一些分号,所以你的代码甚至都不会编译。
  2. argv[]字符串,因此如果您想使用它们,则必须将它们转换为整数。
  3. C不会在二进制文件中存储函数名称,因此您必须创建某种调用表。
  4. 下面找一个工作示例。我创建了一个struct,它将名称映射到一个函数,实现该函数并去寻找它。这是非常错误的(没有进行输入验证),但是为您提供了关于如何实现此目的的概念证明。

    #include <stdlib.h>
    #include <stdio.h>
    
    struct fcn_entry {
      char *name;
      void (*fcn)(char *);
    };
    
    void fcn1(char *fn) {
       printf("fcn1: %s\n", fn);
    }
    
    void fcn2(char *fn) {
       printf("fcn2: %s\n", fn);
    }
    
    void main(char argc,char *argv[]){
        // name-to-function table
        struct fcn_entry entries[] = {
            { "fcn1", fcn1 },
            { "fcn2", fcn2 },
            { NULL, NULL }
        };
        void (*fcn_to_call)(char *);
        int i = 0;
    
        printf("%s",argv[1]);    //filename
    
        printf("%s",argv[2]);    //function to be called    
        char* func_name = argv[2];
        i = 0;
        while(entries[i].name != NULL) {
            if (strcmp(entries[i].name, func_name) == 0) {
               fcn_to_call = entries[i].fcn;
               break;
            } else {
               fcn_to_call = NULL;
            }
            i++;
        }
    
    
        printf("%s",argv[3]);    //how many times the function is called
        int repeat = atoi(argv[3]);
    
        for(i=0;i<repeat;i++){
            fcn_to_call(argv[1]);
        }
    }
    
相关问题