我正在尝试在运行已编译的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
我该怎么做?任何帮助,将不胜感激 !
答案 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)
首先关闭:
argv[]
是字符串,因此如果您想使用它们,则必须将它们转换为整数。下面找一个工作示例。我创建了一个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]);
}
}