CodingFirst

C言語、Perl、JavaScript、最近はPythonも。出来上がったものより、プログラムを書くことが好き。あと、スイーツ。

スポンサーサイト

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C言語でコマンドライン引数処理

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

C言語で簡単なコマンドライン引数の処理を書いた。

コマンドラインオプションの処理は、とりあえず getopt() が思い浮かぶ。
書式としては一般的なんだろうと思うけども、
自作ツールとかで使うにはちょっと気が重い。あと、環境依存もするし。
なので、似たような書式になるコードを書くのがいいとこかなと。

Manpage of GETOPT
getopt - Wikipedia, the free encyclopedia

で、自作ツールなどで何度かコマンドライン処理を書いてて、
下のようなコードに落ち着いた。

#include <stdio.h>
#include <string.h>

#define ARG_FLAG(s) (strcmp(s,argv[i])==0)
#define ARG_SPARAM(s) ((strcmp(s,argv[i])==0)&&(i+1)<argc&&((r=argv[++i])!=NULL))
#define ARG_LPARAM(s) ((strncmp(s,argv[i],strlen(s))==0)&&((l=strlen(s))<strlen(argv[i]))&&((r=&argv[i][l])!=NULL))

void main(int argc,char*argv[]){
  int i;
  for (i=1;i<argc;i++){
    char*r=NULL;
    int l=0;
    if (argv[i][0]!='-'){
      break;
    }else if(ARG_FLAG("--")){
      i++;
      break;
    }else if(ARG_FLAG("-f")){
      printf("option f\n");
    }else if(ARG_SPARAM("-s")){
      printf("option s with value %s\n",r);
    }else if(ARG_FLAG("--longflag")){
      printf("option longflag\n");
    }else if(ARG_LPARAM("--longparam=")){
      printf("option longparam with value %s\n",r);
    }else{
      printf("error\n");
    }
  }

  if(i<argc){
    printf("last option %s\n",argv[i]);
  }
}

だんだん高機能化してって、
一時期 getoptみたいな関数化した時期もあったけど、
面倒くさくなってきて、ベタにstrcmpで書いた方が逆に簡単と思うようになり、
でも毎回、strcmp書くのはめんどくさいのでマクロ化。
という流れ。

動作例。

$ gcc arg.c
$ ./a.out -f -s 10 --longflag --longparam=20 aaa
option f
option s with value 10
option longflag
option longparam with value 20
last option aaa

«  | HOME |  »

Search

Recent Entries

Foot Print



Categories

Monthly

Recent Comments

Recent Trackbacks

Profile

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。