C言語で可変個引数の数を数える方法
この記事では、C言語において可変個引数(可変長引数)を受け取る関数で、実際に渡された引数の数を扱う方法について解説します。
C言語では「エリプシス(...)」と呼ばれる記法がサポートされており、これを使うことで関数が任意の個数の引数を受け取れるようになります。ただし、可変個引数そのものには「引数の個数」の情報が含まれていないため、呼び出し側から何らかの形で個数を伝える必要があります。一般的な方法は次の3つです。
可変個引数の数を伝える3つの方法
- 最初の引数として個数を渡す:第1引数に、後続の引数の総数を明示的に指定します。
- 最後の引数としてNULLを渡す:終端マーカーとしてNULLを渡し、NULLが現れるまで引数を読み取ります。
- printf()やscanf()と同じ方式を使う:第1引数の書式文字列に含まれるプレースホルダー(%d や %s など)の数から、後続の引数の個数を判断します。
以下のサンプルプログラムでは、最も基本的な「最初の引数で個数を渡す」方式を採用しています。標準ヘッダー stdarg.h が提供するマクロを使い、渡された整数引数の合計を計算します。
サンプルコード
#include <stdio.h>
#include <stdarg.h>
int get_sum(int count, ...) {
va_list ap; /* 可変個引数へアクセスするためのリスト */
int i;
int sum = 0;
va_start(ap, count); /* 引数アクセスの開始位置を初期化 */
for (i = 0; i < count; i++) {
sum += va_arg(ap, int); /* 引数を1つずつint型として取得 */
}
va_end(ap); /* 引数アクセスの終了処理 */
return sum;
}
int main(void) {
printf("Total variable count is: %d\n", get_sum(5, 8, 5, 3, 4, 6));
return 0;
}実行結果
Total variable count is: 26
コードのポイント
va_list:可変個引数を順番に辿るための型です。va_start(ap, count):可変個引数へのアクセスを開始する前に必ず呼び出します。第2引数には、直前の固定引数(ここではcount)を指定します。va_arg(ap, int):引数を1つ取り出します。第2引数にはその引数の型を指定します。渡されたデータと異なる型を指定すると未定義動作になるため注意が必要です。va_end(ap):すべての引数へのアクセスが完了した後に必ず呼び出します。
このように、stdarg.h のマクロ群を組み合わせることで、C言語でも printf のような柔軟な可変個引数関数を実装できます。ただし、引数の型や個数はコンパイル時に検証されないため、呼び出し側との取り決め(個数の明示、終端マーカー、書式文字列など)を正しく設計することが重要です。
-
Microsoft Wordで文字数・単語数を確認する方法まとめ
Microsoft Wordには、文書に入力した単語数を数えるカウンター機能が標準で搭載されています。指定された字数や単語数の制限がある文書を作成する際に非常に便利な機能で、単語数だけでなく文字数も同時にカウントできます。 Wordで単語数を確認する方法はいくつかあります。画面下部のステータスバーを使う方法、「文字カウント」ウィンドウを開く方法、さらには単語数をフィールドとして文書内に直接挿入することも可能です。ブラウザ版のWord Onlineでも同じように単語数と文字数をチェックできます。 入力しながらリアルタイムで単語数を確認する Microsoft Wordにはリアルタイムの単語カウン
-
AndroidのSQLiteでCOUNT()関数を使ってレコード件数を取得する方法
本題に入る前に、AndroidにおけるSQLiteデータベースについて簡単におさらいしておきましょう。SQLiteは、デバイス上のテキストファイルにデータを保存するオープンソースのSQLデータベースであり、Androidには標準でその実装が組み込まれています。SQLiteはリレーショナルデータベースの機能を幅広くサポートしており、JDBCやODBCのような特別な接続設定を行わずに利用できるのが特徴です。この記事では、AndroidのSQLiteでCOUNT()集計関数を使用してレコード件数を取得する方法を、サンプルコードとともに解説します。実装手順ステップ1:新規プロジェクトの作成Androi