C言語-コマンドの作成
前へ 目次へ 次へ 

1 コマンドの作成

 UNIXなどのオペレーティングシステム(OS)に、用意されているコマンドのいくつかをC言語で作成してみよう。

1-1 コマンドラインの取得

 コマンドの後に続けてファイル名などを指定するが、これらをC言語で取り込み利用する方法を確認しておく。「C 基礎編 main関数に引数を渡す」も参照のこと。
 次のサンプルは、コマンドラインで指定した文字列を取り込んで表示させる。

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
/* sample1.c */
#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;

    printf("argc=%d\n", argc);    /* ←文字列の個数を表示する */
    for(i = 0; i < argc; ++i)
        printf("argv[%d]=%s\n",i, argv[i]);
}
実行結果

% sample abc def 12345 ghi
argc=5
argv[0]=sample
argv[1]=abc
argv[2]=def
argv[3]=12345
argv[4]=ghi


 

1−2 オプション判定

 コマンドに特別な処理をさせる場合には、コマンドに続けてオプション文字を指定する。UNIXでは、このオプション文字には他のファイル名などと区別するために直前に-をつける。MS-DOSでは直前に/をつける。
 引数の先頭が-かどうかを判定するプログラムを作成する。

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
/* sample2.c */
#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;

    printf("argc=%d\n", argc);
    for(i = 0; i < argc; ++i){        /* ↓ コマンドラインと先頭文字を表示 */
        printf("argv[%d]=%s Top=%c\n",i, argv[i], *argv[i]);
        if(*argv[i] == '-')
            printf("This is OPTION (%s)\n", argv[i]+1);
    }
}
実行結果

% sample abc -d 12345 -e
argc=5
argv[0]=samplex Top=s
argv[1]=abc Top=a
argv[2]=-d Top=-
This is OPTION (d)
argv[3]=12345 Top=1
argv[4]=-e Top=-
This is OPTION (e)


 引数文字列の先頭アドレスは、それぞれ配列argv[i]に格納されているから、その先頭文字を取り出すためにポインタ演算子*を使う。*argv[i] オプション文字は、-の後に1文字以上あるはずであるから引数文字列の2番目の文字以降を取り出す。2番目のアドレスは、argv[i] + 1で得られる。

 次に、特定のオプションを判定するプログラムを作成する。
 オプション文字は、a,b,cの3つがあるものとして判定し、それぞれ適当なメッセージを表示するようにする。オプション文字以外のオプションが指定された場合も警告のメッセージを表示する。

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
/* sample3.c */
#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;

    printf("argc=%d\n", argc);
    for(i = 0; i < argc; ++i){
        printf("argv[%d]=%s\n", i, argv[i]);
        if(*argv[i] == '-')
        switch(*(argv[i] + 1)){
            case 'a':
                puts("This OPTION is 'a'");
                break;
            case 'b':
                puts("This OPTION is 'b'");
                break;
            case 'c':
                puts("This OPTION is 'c'");
                break;
            default:
                puts("OPTION ERROR");
        }
    }
}

 オプション文字が複数あるのでswitch文で判定している。オプションが少なければif文で判定しても良いだろう。次にそのリストを示す。

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
/* sample4.c */
#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;
    char opt;

    for(i = 0; i < argc; ++i){
        printf("argv[%d]=%s\n", i, argv[i]);
        if(*argv[i] == '-'){
            opt = *(argv[i]+1);
            if(opt == 'a')
                puts("This OPTION is 'a'");
            else if(opt == 'b')
                puts("This OPTION is 'b'");
            else if(opt == 'c')
                puts("This OPTION is 'c'");
            else
                puts("OPTION ERROR");
        }
    }
}
実行結果

% samplex -b -a -z -c
argc=5
argv[0]=samplex
argv[1]=-b This OPTION is 'b'
argv[2]=-a This OPTION is 'a'
argv[3]=-z OPTION ERROR
argv[4]=-c This OPTION is 'c'



 opt = *(argv[i]+1); としているのは、計算を1度で済ませて処理スピードのアップをはかるためである。


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system