UNIXシステムコールプログラミングのページ(仮)

第1回課題1bのヒント

オプション-R 整数の実装方法

snprintfを使ってフォーマット文字列を生成する方法を紹介します。整数を数値として保存する方法と文字列として保存する方法があります。

数値として保存する方法

フォーマット文字列を保存するための十分大きな配列を用意します。たとえば、

char format0[100];

Rオプションがあったかどうかを覚えておくためのフラグ変数を定義します。たとえば、

char Rflag = 0;

数値として保存するための変数を定義します。たとえば、

unsigned Rval;

オプション処理のループ中のswitch文の本体で、オプションRの処理として、sscanfを使って数値に変換します。たとえば、

        case 'R':
                Rflag = 1;
                sscanf(optarg, "%u", &Rval);
                break;

Rフラグが立っている場合、snprintfを使ってフォーマット文字列を書き込み、それをフォーマットとして使うように設定します。たとえば、

        if (Rflag) {
                snprintf(format0, sizeof(format0), "%%%ulld\n", Rval);
                format = format0;
        }

文字列として保存する方法

フォーマット文字列を保存するための十分大きな配列を用意します。たとえば、

char format0[100];

文字列として記録するためにポインタを保存する変数を定義します。たとえば、

const char *Rarg = NULL;

オプション処理のループ中のswitch文の本体で、オプションRの処理として、sscanfを使って数値に変換します。たとえば、

        case 'R':
                Rflag = 1;
                Rarg = optarg;
                break;

Rフラグが立っている場合、snprintfを使ってフォーマット文字列を書き込み、それをフォーマットとして使うように設定します。たとえば、

        if (Rarg != NULL) {
                snprintf(format0, sizeof(format0), "%%%slld", Rarg);
                format = format0;
        }

getopt()の使い方の解説が続く予定)


戻る