PREVIOUS | TOP | NEXT

コマンドライン引数

目標

コマンドライン引数とはmain 関数の引数のことです。 実行するときに、 コマンドラインからコマンドライン引数に値を与えることができます。 コマンドライン引数を利用したC言語プログラムの作成と利用方法を学ぶことが今日の目的です。

コマンドライン引数をもつプログラム

これまでは main関数を

main(){
....

としてきましたが、ここを

main(int argc, char *argv[]){
....

に変更します。これで準備完了です。argc, argvの意味ですが、 argcはコマンドライン引数の数 文字列配列argvにはコマンドライン引数が格納されます。例えば、

% ./a.out 100 abc
%

を実行すると、

argc=3; コマンドライン引数の数
argv[0]="./a.out";
argv[1]="100";
argv[2]="abc";

と、 コマンドライン引数を介して、プログラムに値が渡されます。 ここで、

に注意して下さい。

課題1

 以下のプログラムは、コマンドラインに入力された文字列の個数と、文字列を表示するプログラムです。

#include <stdio.h>

int main(int argc, char *argv[]){
  int i;
  
  printf("文字列の個数 %d\n",argc);
  for(i=0;i<argc;i++)
    printf("%d 番目の文字列 %s\n",i,argv[i]);
  return 0;
}

実行例

% ./a.out This is a pen
文字列の個数 5
0 番目の文字列 ./a.out
1 番目の文字列 This
2 番目の文字列 is
3 番目の文字列 a
4 番目の文字列 pen
%

課題
上記のソースコードを参考にして、コマンドラインに入力された文字列で0番目の文字列を除いた ものを逆順に表示するプログラムを作りなさい:

% ./a.out This is a pen
4 番目の文字列 pen
3 番目の文字列 a
2 番目の文字列 is
1 番目の文字列 This
% ./a.out This is a pen. And that is a pencil.
9 番目の文字列 pencil.
8 番目の文字列 a
7 番目の文字列 is
6 番目の文字列 that
5 番目の文字列 And
4 番目の文字列 pen.
3 番目の文字列 a
2 番目の文字列 is
1 番目の文字列 This
%

課題2

以下のプログラムは、ライブラリ関数 atoi() を用いることで、コマンドライン入力の文字列を数値に変換し、 その値を2倍して表示するプログラムである。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
  int i;
  int n;
	
  for(i=1;i<argc;i++){
    n=atoi(argv[i]);
    printf("%d\n",n*2);
  }
  return 0;
}

実行例

% ./a.out 10 2 34 abc -5 3.5
20
4
68
0
-10
6
%

解説
 関数 atoi() は文字列を整数型(int)の数値に変換する関数です。これを利用するためには #include <stdlib.h> をプログラムの先頭に書き加える必要があります。
 同様の処理をする関数に atof() 関数があります。これは文字列を実数型(float)に変換するものです。
 実行例を見ればわかるように、変換できない場合(数字でない場合)の戻り値は 0 になります。
課題
 コマンドラインに入力された数字の和を計算し、その結果を表示するプログラムを作成せよ:

% ./a.out 1 2 3 4 5
15
%

課題3

コマンドラインに入力された数字の平均値、分散を計算し、印字するプログラムを作成せよ。 ただし数値は実数型で取り扱うこと
平均・分散  n 個の数値 x1,...xn の 平均 μ, 分散 σ2は、次のように与えられる:
μ=(x1+...+xn)/n
σ2=((x1-μ)2+...+(xn-μ)2)/n

実行例

% ./a.out 1.0 2.5 3 4.5 0.1 
平均 2.220000  分散 2.373600
%

ヒント 平均を求めるには、入力された数の和をいったん求めて、それを入力された数の個数で割ればよい。 分散の計算も同様に、ただし (xi-μ)2 の和を考える。

課題4

 3つの実数 x0, x1, dx を与えると

plot [0:2*pi] [-1:1] sin(x+x0)
pause 0.5
plot [0:2*pi] [-1:1] sin(x+x0+dx)
pause 0.5
plot [0:2*pi] [-1:1] sin(x+x0+2dx)
pause 0.5
・
・
・
plot [0:2*pi] [-1:1] sin(x+x1)
のように印字するプログラムを作成せよ。つまり実行例としては
%./a.out 5 6.5 0.25
plot [0:2*pi] [-1:1] sin(x+5.00)
pause 0.5
plot [0:2*pi] [-1:1] sin(x+5.25)
pause 0.5
plot [0:2*pi] [-1:1] sin(x+5.50)
pause 0.5
plot [0:2*pi] [-1:1] sin(x+5.75)
pause 0.5
plot [0:2*pi] [-1:1] sin(x+6.00)
pause 0.5
plot [0:2*pi] [-1:1] sin(x+6.25)
pause 0.5
plot [0:2*pi] [-1:1] sin(x+6.50)
%

となるようなものである。


PREVIOUS | TOP | NEXT