C LANGUAGE TECHNOLOGY

【C言語】getopt/getopt_long関数の使い方

悩んでいる人

C言語でgetopt/getopt_long関数の使い方を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

getopt関数

getopt関数は,コマンドライン引数(オプション)を解釈する関数です.

getopt関数がとる引数argcとargvは,main関数に渡された引数の個数と配列です.

argvの要素の中で'-'で始まるもの(かつ "-" 単独や "--" 単独ではないもの)はオプション要素になります.

また,オプション要素から先頭の'-'を除いた文字(-aの場合はa)は,オプション文字になります.

getopt関数は,繰り返し呼び出される毎に次のオプション文字を返します.

変数optindは,argvの次に処理される要素の添字です.

プログラムの起動時にシステムがoptindを1に初期化します.

プログラム中にoptindを1にリセットすることで,同じargvのスキャンをやり直すことができます.

新たなオプション文字が見つかると,getopt関数はその文字を返し,外部変数optindと静的な変数nextcharを更新します.

これらの処理を行うことで,getopt関数は次の呼び出しの際に,以降のオプション文字やargvの要素のスキャンを継続できます.

オプション文字が見つからない場合,-1を返します.

optindは,argvの要素の中でオプションでない最初の要素を示します.

また,optstringは受け付けるオプション文字からなる文字列です.

文字の後にコロン(:)が置かれている場合は,そのオプションには引数が必要であることを示します.

現在注目しているargv要素で,オプション文字に引き続くテキストへのポインタか,あるいは次のargv要素のテキストへのポインタをoptargに代入します.

2個連続してコロンが置かれている場合(::)は,そのオプションは引数を取っても取らなくても良いです.

getopt関数のコード

getopt関数のコードは以下になります.

実行結果は以下になります.

getopt_long関数

getopt_long関数は,長いオプション(2つのダッシュ"--"で始まるオプション)を受け入れること以外はgetopt関数と同様に動作します(プログラムに長いオプションだけが渡された場合,optstringはNULLではなく空文字列("")になります.).

長いオプションの名前は,定義されたオプションに正確にマッチする場合以外にも,他と重ならない範囲において短縮できます.

長いオプションは引数を取ることができ,「--arg=param」または「--arg param」と言う形式で指定します.

getopt_long関数固有の引数は以下になります.

  • longopts:struct optionの要素からなる配列の先頭要素へのポインタ
  • longindex:NULLでない場合,長いオプションの添字をlongoptsからの相対位置として保持している変数へのポインタ

struct option構造体の定義は以下になります.

struct option構造体のフィールドの解説は以下になります.

  • name:長いオプションの名前を設定します.
  • has_arg:no_argument(または 0)の場合,オプションは引数を取りません.
    required_argument(または1)の場合,オプションは引数を必要とします.
    optional_argument(または2)の場合,オプションは引数を取っても取らなくても良いです.
  • flag:長いオプションに対する結果の返し方を指定します.
    flagがNULLの場合,getopt_long関数はvalを返します(例:呼び出し元のプログラムは,valに等価なオプション文字を代入することができます.).
    NULL以外の場合には,getopt_long関数は0を返します.オプションが見つかった場合,flagが指す変数にvalが代入されます.
    見つからない場合,flagは変更されません.
  • val:返り値,またはflagが指す変数に代入される値を設定します.

ここで,has_argがoptional_argumentの場合は,「--arg param」と--argとparamの間が空白の場合は正常に動作しないので注意して下さい.

「--arg=param」と=を入れて書くと正常に動作します.

getopt_long関数のコード

getopt_long関数のコードは以下になります.

まずはビルドしましょう.

addオプションの実行結果は以下になります.

appendオプションの実行結果は以下になります.

deleteオプションの実行結果は以下になります.

noverboseオプションの実行結果は以下になります.

verboseオプションの実行結果は以下になります.

まとめ

C言語でgetopt/getopt_long関数の使い方を紹介しました.

getopt/getopt_long関数を使いこなすのは難しいですが,何度も読み直してきちんと理解しましょう!

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , ,