2

C 関数に多くの引数を渡すにはどうすればよいですか? 私がこの機能を持っていると仮定します:

void f(int n, char* a, char* b, ...)

未定義の数の char* 引数が必要です。どうすればそうできますか?

4

2 に答える 2

5

必要なものは可変数引数関数と呼ばれるもので、9.9 から読むことができます。可変数の引数は、優れたエッセイのチュートリアルです。

私のコードを理解するには、次の 4 点の短い理論が役立ちます。

  1. ヘッダー ファイルを含める必要があり<stdarg.h>ます。彼は va_list と呼ばれる新しい型と、この型のオブジェクトを操作するva_start, va_arg, and va_end.
  2. va_start:オプションの引数arg_ptrのリストの先頭に設定するマクロですap
  3. va_arg:この保存されたスタック ポインターを使用し、提供された型の正しいバイト数を抽出します。
  4. va_end:リセットするマクロです。apすべての引数が取得された後va_end、ポインターを NULL にリセットします。

この理論は十分ではありませんが、以下の例 (必要に応じて) は、基本的なワークフローと手順を理解するのに役立ちます: (各 4 つの手順のコメントを読んでください)

//Step1: Need necessary header file
#include <stdarg.h>     
void f(int first, char* a, char* b, ...){   
    va_list ap;  // vlist variable
    int n;       // number 
    char aa,     
    int i;
    float f;
   //print fix numbers of arguments
    printf("\n %d, %s, %s\n", first, a, b);

   //Step2: To initialize `ap` using right-most argument that is `b` 
    va_start(ap, b); 

   //Step3: Now access vlist `ap`  elements using va_arg()
     n = va_arg(ap, int); //first value in my list gives number of ele in list 
     while(n--){
       aa = (char)va_arg(ap, int); // notice type, and typecast
       i = va_arg(ap, int);
       f = (float)va_arg(ap, double);   
       printf("\n %c %d %f \n", aa,i, f);
    }

    //Step4: Now work done, we should reset pointer to NULL
    va_end(ap); 
}
int main(){
    char* a = "Aoues";
    char* b = "Guesmi";
    f(2, a, b, 3, 'a', 3, 6.7f, 'b', 5, 5.5f, 'A', 0, 0.1);
    //         ^ this is `n` like count in variable list
    return 1;
}

誰が実行しますか:

~$ ./a.out 
 2, Aoues, Guesmi
 a 3 6.700000 
 b 5 5.500000 
 A 0 0.100000 

私のコードの簡単な説明は、将来のユーザーに役立ちます。

  1. 実際には、関数は固定数の引数の後に可変数の引数が続きます。そして、関数の右端の引数 (関数内の固定引数リストchar* bf()) は、初期化された実行可能リストにのみ使用されますap
  2. 上記の関数は、値をf()読み取ります( main のコメントを読み取ります)。では、 が 3 回実行され、ループのたびにマクロを使用して 3 つの値を取得します。n3f()while(n--)va_arg()
  3. 私が最初に 2 つを読んでから、 を送信していることに気付いた場合ints( mainで f() を呼び出していることに注意してください)。これは、可変引数リストの場合に自動型プロモートが行われるためです。(詳しくは上記のリンクからお読みください)doublechar, int, float

彼女は MSDN からのもう 1 つの便利なリンクです: va_arg, va_​​end, va_​​start .

これに関してさらにサポートが必要な場合はお知らせください

于 2013-04-05T09:59:21.973 に答える
0

varargs を使用します (これを自分で調べてください。呼び出し先が引数を読み取るために使用するものは にありますstdarg.h)。

呼び出し先が実際に渡された引数の数を自動的に決定する方法はないことに注意してください。たとえば、それは である可能性がありn、呼び出し元を信頼してn正しく処理する必要があります。

于 2013-04-05T09:46:09.300 に答える