C言語-コマンドの作成 |
UNIXなどのオペレーティングシステム(OS)に、用意されているコマンドのいくつかをC言語で作成してみよう。
コマンドの後に続けてファイル名などを指定するが、これらを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 |
コマンドに特別な処理をさせる場合には、コマンドに続けてオプション文字を指定する。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 |
引数文字列の先頭アドレスは、それぞれ配列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 |
Copyright © 2001 Hiroshi Masuda |