10.ポインタ

10-16. コマンドライン

◇コマンドライン

コマンドラインとはプログラム起動時にmain関数へ引き渡す引数のことです。
ちなみにコマンドとはコンソール画面上で入力する実行ファイル名などを示します。そのライン上がコマンドラインであると思ってください。

◇配列で受け取る

・サンプルプログラム
(注:行番号を入れてあります)

1: #include<stdio.h>
2: main(int argc, char *argv[])
3: {
4:     int i;
5:     printf("argc = %d\n",argc);
6:     for(i=1;i<argc;i++)
7:         printf("param%d    %s\n",i,argv[i]);
8: }

・実行方法(実行ファイル名が test.exe の場合)

>test.exe C-Production No.114 Standard Edition [Enter]
~~~~~~~~ ~~~~~~~~~~~~ ~~~~~~ ~~~~~~~~ ~~~~~~~
この下線の部分がmain関数の引数として渡されます。
コマンドそのものも入ります。

・実行結果

argc = 5
param1 C-Production
param2 No.114
param3 Standard
param4 Edition

・解説
2行目の仮引数 argc はコマンドライン引数の個数を受け取ります。
そして *argv[] はコマンドラインの文字列を取得します。
ちなみに上のプログラムでは

argv[0] –>”test.exe”
argv[1] –>”C-Production”
argv[2] –>”No.114″
argv[3] –>”Standard”
argv[4] –>”Edition”

となっています。
メモリーイメージは

+——+ +———-+
argv[0]| |——>| test.exe |
|——| |———-+—+
argv[1]| |——>| C-Production |
|——| |——–+—–+
argv[2]| |——>| No.114 |
|——| |——–+-+
argv[3]| |——>| Standard |
|——| |———++
argv[4]| |——>| Edition |
+——+ +———+

このようになります。

◇ポインタで受け取る

コマンドラインは配列だけでなくポインタでも受け取ることができます。

・サンプルプログラム
(注:行番号を入れてあります)

1: #include<stdio.h>
2: main(int argc, char **argv)
3: {
4:     int i;
5:     printf("argc = %d\n",argc);
6:     for(i=1;i<argc;i++)
7:         printf("param%d    %s\n",i,*(++argv));
8: }

argc = 5

param1 C-Production
param2 No.114
param3 Standard
param4 Edition

さっきと似ているように思えますがメモリーイメージは違って次のようになります。

argv
+——+ +——+ +———-+
| |–+–>| |——>| test.exe |
+——+ | |——| |———-+—+
+–>| |——>| C-Production |
| |——| |——–+—–+
+–>| |——>| No.114 |
| |——| |——–+-+
+–>| |——>| Standard |
| |——| |———++
+–>| |——>| Edition |
+——+ +———+

argvをインクリメントすることにより次の文字列を指す

補足説明:
コマンドラインについて読者様より質問をいただきました。

> コマンドライン引数なんですが、このまま打鍵すると、
> セパレートと言うのかデリミタと言うのか、それで
> 半角スペースを含む文字列が取得できませんね・・・。
>
> ダブルクォーテーションで挟むとOKでしょうか?

基本的にダブルクォートでいけます。
Cプロダクションでのチェック環境(Win98+BCC5.5)でも大丈夫でした。

そういえばWindowsなどはスペースを含むディレクトリ(My Document)があって対応がややこしいですね。

ショートカットの内容やレジストリをいじる時などもこのスペース付ディレクトリによく悩まされます(笑)

次章
11.構造体