繁体   English   中英

在C中从命令行输入多个输入参数

[英]multiple input parameters from command line in C

我试图在运行已编译的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 

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

为了能够以字符串形式调用函数,您已经知道哪个名称与哪个函数配对。

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

否则,如果参数不同,则必须有一系列strcmp调用才能调用正确的函数。

这里有很多错误。

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.

首先:

  1. 您缺少一些分号,因此您的代码甚至无法编译。
  2. argv[]字符串 ,因此,如果要按原样使用它们,则必须将它们转换为整数。
  3. C不在二进制文件中存储函数名称,因此您必须创建某种调用表。

下面找到一个工作示例。 我创建了一个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]);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM