Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

Cでの可変長引数


場合によっては、事前定義された数のパラメーターの代わりに、可変数の引数、つまりパラメーターを受け取ることができる関数が必要な状況に遭遇することがあります。 C / C ++プログラミング言語はこの状況の解決策を提供し、要件に基づいて可変数のパラメーターを受け入れることができる関数を定義することができます。次の例は、そのような関数の定義を示しています。

int func(int, ... ) {
   .
   .
   .
}
int main() {
   func(1, 2, 3);
   func(1, 2, 3, 4);
}

関数func()が 最後の引数は楕円、つまり3つのドット(...)であり、楕円の直前の1つは常に int これは、渡された変数引数の総数を表します。このような機能を使用するには、 stdarg.hを使用する必要があります 可変引数の機能を実装し、指定された手順に従うための関数とマクロを提供するヘッダーファイル-

  • 最後のパラメーターを楕円として関数を定義し、楕円の直前の関数は常に引数の数を表すintです。
  • va_listを作成します 関数定義に型変数。このタイプは、stdarg.hヘッダーファイルで定義されています。
  • intを使用する パラメータとva_start va_listを初期化するマクロ 引数リストへの変数。マクロva_startは、stdarg.hヘッダーファイルで定義されています。
  • va_argを使用します マクロとva_list 引数リストの各項目にアクセスするための変数。
  • マクロを使用するva_end va_listに割り当てられたメモリをクリーンアップします 変数。

次に、上記の手順に従って、可変数のパラメーターを受け取り、それらの平均を返すことができる単純な関数を書き留めます-

#include <stdio.h>
#include <stdarg.h>
double average(int num,...) {
   va_list valist;
   double sum = 0.0;
   int i;
   va_start(valist, num); //initialize valist for num number of arguments
   for (i = 0; i < num; i++) {
      //access all the arguments assigned to valist
      sum += va_arg(valist, int);
   }
   va_end(valist); //clean memory reserved for valist
   return sum/num;
}
int main() {
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f", average(3, 5,10,15));
}

出力

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000

  1. CおよびC++の可変長配列

    ここでは、C++の可変長配列について説明します。これを使用して、可変サイズの自動配列を割り当てることができます。 Cでは、C99標準の可変サイズの配列をサポートします。次の形式はこの概念をサポートしています- void make_arr(int n){    int array[n]; } int main(){    make_arr(10); } しかし、C ++標準(C ++ 11まで)には、可変長配列の概念はありませんでした。 C ++ 11標準によれば、配列サイズは定数式として言及されています。したがって、上記のコードブロックは有効なC++1

  2. Cプログラムで奇数の長さの文字列を「X」形式で印刷します。

    文字列プログラムで指定された場合、文字列を「X」形式で出力する必要があります。参考までに、下の画像を参照してください。 ここでは、1つの変数を使用して左から右( i)に印刷し、他の変数を使用して右から左( j)に印刷し、他の変数kを使用してスペース計算に使用できます。 以下は、与えられたアルゴリズムのC++実装です。 アルゴリズム START Step 1 ->Declare Function void print(string str, int len)    Loop For int i = 0 and i < len and i++