0

コンパイルされた 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 

どうすればいいですか?どんな助けでも大歓迎です!

4

3 に答える 3

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.
于 2013-08-13T11:38:31.587 に答える
1

最初に:

  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]);
    }
}
于 2013-08-13T11:43:38.947 に答える