C:コマンドラインパラメタを利用したCプログラム

C言語初級カテゴリのロゴ画像C言語初級
スポンサーリンク

C言語では、ユーザにデータを入力させる方法として、

1.標準入力装置から(通常はキーボードからの入力)
2.ファイルから
3.コマンドラインパラメタから

の3つの方法があります。

この記事では、3番目のコマンドラインパラメタからの入力を利用したCプログラムを解説します。

スポンサーリンク

コマンドラインパラメタとは?

まず、コマンドラインパラメタの意味です。

一言でいうと

コマンド(命令)を実行するときに付け加える要素

となります。

コンピュータはアプリケーションを起動(実行)するときにパラメタを指定しない場合いくつかのパラメタを指定する場合とがあります。
分かりやすい例を挙げるとワードを起動して文章作成する場合です。

新規作成でワードファイルを作る場合、スタートメニューなどから
C:コマンドラインパラメタを使う

ワードアイコンをクリックして起動します。
もし既に作成済みのワードドキュメントがある場合は、ドキュメントアイコンをダブルクリックするとワードが起動して文書が表示されるはずです。

C:コマンドラインパラメタを使う

ユーザ側から見ると、マウス操作やタッチ操作ですが、実はコンピュータ内部では、すべてコマンドと呼ばれる文字列による操作が実行されています。
マイクロソフトのワードは、Windowsの場合「WINWORD.EXE」が正式なアプリケーションファイル名です。

マイクロソフトのワードの場合、新規作成なら

winword

というコマンドが実行されています。
既存のファイル「hoge.docx」を開く場合であれば、(hogeはただのファイル名です。最近はこの日本特有のhogeが20代くらいの若者には通じないようですね!)

winword hoge.docx

というコマンドが実行されています。
ワードファイルをダブルクリックするという動作で、実際は上記の文字列が飛び交っている訳です。
コマンドラインパラメタとは、このワードの場合であれば「hoge.docx」のことを指します。
C言語では、これらのコマンドラインパラメタの文字列が自動的に変数に代入されてプログラムから利用できるようになります。

C言語では実行アプリケーションのwinword自身もコマンドラインパラメタとして認識されます。

コマンドラインパラメタを使ったプログラム基本形

C言語には、argcとargvという2つのコマンドラインパラメタ用の変数があります。

意味は以下の通りです。

int argc;コマンドラインに指定したパラメタ要素数
最小値は1(=アプリケーションプログラム名)
char *argv[]コマンドラインに指定したパラメタ文字列
順番にargv[0], argv[1], argv[2]…と指定した要素数に応じて添え字が増えていく
C言語では、argv[0]は、アプリケーション名が代入される。

argcは、int型整数値です。
argvは、char型の2次元配列と考えた方が分かりやすいでしょう。

コマンドラインパラメタを利用したCプログラムを作成したい場合、main関数の引数宣言部分に次のように記述します。

int main(int argc, char *argv[])
{
/* 省略 */
}

コマンドラインパラメタを画面に表示してみる

実際にargcとargvを使ったプログラム例です。
argcとargvの中身を画面に表示してみます。

commandline1.c

#include <stdio.h>

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

実行するときにコマンドラインから以下のように入力します。(先頭のcommandlineはアプリケーション名です。コンパイル後に作成された実行ファイルcommanline.exeが存在するものとして実行した場合です。)

実行時(コマンドラインやターミナルで以下を入力後、エンターキーで実行)

commandline ABC DEF

パラメタ同士の区切り文字として半角スペースを入れるのが決まりです。

実行書式

アプリケーション名 (パラメタ1) (パラメタ2)…[Enter]

実行イメージ

argc = 3

argv[0] = c:\Users\2601\Documents\c\test.exe
argv[1] = ABC
argv[2] = DEF

解説
argcは、アプリケーション名を含めた要素数です。
argv[0]には、アプリケーション名の文字列が代入されます。アプリケーションが保存されているディレクトリ名を含めた文字列となります。
argv[1]以降は、半角スペースで区切っていくつでもパラメタを指定できます。
今回は、ABCとDEFがそれぞれargv[1], argv[2]に自動的に代入されています。

パラメタを指定しないで実行するとどうなるでしょうか?

実行時

commandline

わたしの環境では以下のように表示されました。

実行イメージ

argv[0] = c:\Users\2601\Documents\c\test.exe
argv[1] = (null)
argv[2] = (null)

アプリケーション名のみで実行したため、argv[1]以降は何もない(=NULL)となっています。
このようにパラメタに指定した要素の数によってコマンドラインパラメタの値は変化するわけです。

指定したパラメタだけを表示したい場合は、argcをループのカウンタ上限として次のように処理すればいいでしょう。

commandline_all.c

#include <stdio.h>

int main(int argc, char *argv[])
{
	int i;
	
	printf("argc = %d\n\n", argc);

	for(i=0; i<argc; i++){
		printf("argv[%d] = %s\n", i, argv[i]);
	}

	return 0;
}

【応用1】コマンドラインパラメタに指定した2つの数値の足し算を行う

コマンドラインパラメタに指定した2つの数値の足し算を行うプログラムです。

実行時

tasizan 123 456

実行イメージ

123 + 456 = 579

プログラムは以下のようになります。

tasizan.c

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

int main(int argc, char *argv[])
{
	int x, y;
	
	if(argc != 3){
		printf("2つの整数を指定してください\n");
	}
	else{
		x = atoi(argv[1]);
		y = atoi(argv[2]);
		
		printf("%s + %s = %d\n", argv[1], argv[2], x + y);
	}
	
	return 0;
}

解説
9行目:argcの個数は、アプリケーション名もパラメタの1つとしてカウントするため、アプリケーション名の後に指定した2つを含めてargc!=3として判定して、パラメタが2つ以外の場合はエラーメッセージを表示するようにしています。

12~13行目:argvで受け取るパラメタ文字列は数値文字だとしてもすべてchar型となります。atoi関数を使って文字列を整数に変換して計算出来るようにします。

【応用2】コマンドラインパラメタに指定した数値を全て累計する

コマンドラインパラメタに指定した数値を全て累計して表示します。

実行時

ruikei 10 20 30 40 50

実行イメージ

合計は、150です

プログラムは以下のようになります。

ruikei.c

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

int main(int argc, char *argv[])
{
	int i, gokei = 0;
	
	for(i=1; i<argc; i++){
		gokei += atoi(argv[i]);
	}
	
	printf("合計は、%dです\n", gokei);

	return 0;
}

解説
8行目:ループの開始をi=1として、コマンドラインパラメタの2番目(数値部分)から累計しています。

9行目:atoi関数を使って文字列を整数に変換して計算しています。

コメント