• ベストアンサー

Cの本を読んでいて・・・

Cの本(バイブルと呼ばれているもの)を読んでいたのですが、よく理解できなかったので、質問させていただきました。 「コマンド行の引数、Cをサポートする環境においては、コマンド行の引数すなわちパラメータを、実行開始時にプログラムに渡す方法がある。具体的には、実行開始時にmainが呼び出されたときに、二つの引数が渡される。最初の引数は、そのプログラムを呼び出したコマンド行の引数の個数である。二番目は引数を内容とする文字列の配列を指すポインタで、その文字列ひとつが引数ひとつに対応する。」とありました。全体的に分からないのですが、コマンド行とは?mainにプログラムを渡すしくみ?どなたか分かりやすく、教えてください。どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

お使いの環境は Windows なんですよね? >#1さんのプログラムを作成し、DOSを立ち上げれば、作成したプログラムがはしるのでしょうか? OS、コンパイラが何かわからないので答えにくいのですが、まぁ、おそらく実行できるでしょう。 ただし、Windows 用として( 32bit コンソールアプリケーションとして)コンパイルしたものを、Windows のコマンドプロンプトでなく、本物の 16bit MS-DOS で実行しようとしても実行できません。 まぁ、とにかく一度実際にコンパイルしてやってみることですね。やってみればわかります。 >プログラムを作成した後、コマンドプロンプトでどう実行するのですか? #6 の方の回答、そのままですが、npg.exe を作ったとすると、コマンドプロンプトで >npg ABC 123 のようにします。 そうすると、#1 のプログラムは Parameter[1]=ABC Parameter[2]=123 になるはずです。 あと、ちょっと心配なんですが、PATH ってわかりますか? PATH が設定されていないと実行できないので、 ・npg.exe のあるディレクトリに PATH を設定する ・npg.exe のあるディレクトリで実行する ・「>C:\Test\npg ABC 123」のように、npg をフルパスで指定 のいずれかの方法を取ってください。 それと、補足ですが、コマンドライン引数はコマンドプロンプトだけでなく、「ファイル名を指定して実行」やショートカットの「リンク先」でも使用できます。

その他の回答 (6)

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.6

何か関数を作成し、main(1,4)などとして与えるのですか?   たとえば、npg.exe を作ったとします。 このプログラムが引数を持たないときは npg としてから、エンターキーを押します。 引数、ABC と 123 を持つときは npg ABC 123 としてから、エンターキーを押します。  

回答No.5

私も,Cを学習したときには,いろいろ疑問に感じたことがありました. 当時は,K&RのCでした.いまでしたら,ANSI Cですね. まずは,Cのプログラムがどのようにして実行されるのかを 考える必要があります. Windows 環境でしょうか. それとも,Unixでしょうか. コマンドラインが何か?と言うことが疑問ですか? 「コマンドライン」というのは, コマンドを入力するときの打ち込みの事です. 具体的には, windows環境では,「MS-DOSプロンプト」または, 「コマンドプロンプト」で,背景の真っ黒なウィンドウを開いて,自分の作ったCプログラムを動かすとします. たとえば,ftpコマンドというDOSプログラムを起動するときは, この背景の真っ黒なウィンドウで, ftp と打ち込んで「Enter」キーを叩きます. この ftp の行のことを「コマンドライン」 -> コマンド行 といいます. そのとき,システムは,まず main() 関数を呼びだします. 細かいことを書きますと,これがwindowsアプリだと, winmain()関数を呼び出すのですが,私もこのあたり よく理解していません. main()関数をシステムがよびだしたら, 後の仕事は,あなたの作ったプログラムに制御が移ります. このとき,なにかの情報をそのプログラムに与えたい場合があります. 例えば, 「Dir」コマンド をご存じですか? これは,ディレクトリを表示するコマンドです. 特定のディレクトリを指定するときに, Dir c:\ とか, Dir c:\user\foo などと,表示させたいディレクトリをコマンドにつづいて入力してから,「Enter」キーを押下します. このc:\ とか,c:\user\foo は,文字列となって,main()関数に渡されます. それが,argc,argvです. int main(int argc,char *argv[]) と宣言しておくことで,このコマンドライン引数 を取得することが出来ます. argcは引数の数. *argv[]は引数文字列です.argc個あります. ここに書いた話は,DOSプログラムであって, 普通のwindowsプログラムでは おめにかかることはありません. このあたりがわかりにくいんでしょうね. 普通のwindowsアプリでは,引数を与えることはあまりありません.(可能ですけど.) ちょっとわかりにくかったですね.

gogogo-n
質問者

補足

コマンドプロンプトで、利用すると言うことがなんとなくわかりました。そこでまた疑問に思ったのですが、#1さんの言うような、プログラムを作成した後、コマンドプロンプトでどう実行するのですか? これは、結果は出ないもので、こうなりますよと言ってるだけなのでしょうか? どうか回答のほうよろしくお願いします。

回答No.4

>コマンドライン引数の利点 MS-DOS だと COPY コマンドってありますよね。 COPY FILE.TXT C:\TEMP とかって使いますよね。 COPY FILE.TXT C:\TEMP だと argc : 2 argv[0] : "COPY" argv[1] : "FILE.TXT" argv[2] : "C:\TEMP" となります。 (実際には MS-DOS の COPY コマンドは COPY.EXE ではなく COMMAN.COM/CMD.EXE の内部コマンドなので、この通りではありませんが。) MS-DOS のコマンドだけじゃなく、Windows アプリケーションでもコマンドライン引数を渡すことが可能なものはあります。

gogogo-n
質問者

補足

#1さんのプログラムを作成し、DOSを立ち上げれば、作成したプログラムがはしるのでしょうか? よろしくお願いします。

noname#25358
noname#25358
回答No.3

>これを用いてどのようなメリットがあるのでしょうか?  #1の方の補足の書いておられる「関数を作成するのか」の件ですが、それこそが利点です。  コマンドラインのところに記述した引数を、自動的に argv[] に入れてくれ、自動的にその数を argc に入れてくれるんです。  プログラマーは、そこに入った値を素直にただ使用すればいいんです。  そのための使用方法を記述したのが、質問文中の技術なわけです。

gogogo-n
質問者

補足

コマンドラインは、DOSのプロンプトだと聞きましたが、そこに記述するだけで、引数が渡されるということなのでしょうか? 何度もすいません。よろしくお願いします。

noname#25358
noname#25358
回答No.2

 なんか微妙に難しいですね(笑)  大したことじゃないんだから、プロのライターならもうちょっと簡単に書けばいいのに(^_^;  要するに、『MS-DOSプロンプト』からプログラムを起動する場合に、そのプログラムにパラメータを渡す方法が記載されてるんです。  プログラム名に続けてパラメータを書くと、それがプログラムに渡される、と書いてあります。  C言語では、メインとなる関数は下記のように記載するよう、規約で決まっています。 int main( int argc, char argv[] ) {   ... 処理 ... }  このとき、argc には引数の数が自動的に入ります。  そして argv[1] と argv[2] に、それぞれ "ABC" と "123" という文字列が自動的に入る事になります。

gogogo-n
質問者

補足

すいません。まだよくわかりません。 また、これを用いてどのようなメリットがあるのでしょうか? 時間がありましたら、よろしくお願いします。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 以下のプログラムから実行ファイルを作成して、 適当な引数を与えて実行してみて下さい。 最初の引数は・・・に該当するのが、argc で、 二番目は・・・に該当するのはargv です。 -------------------------------------------- #include <stdio.h> int main(argc, argv) int   argc; char  *argv[]; {   int   loop;   printf("# of Parameters = %d\n", argc);   for (loop = 0; loop < argc; loop++) {     printf("Parameter[%d] = %s\n", loop, argv[loop]);   }   return(0); }

gogogo-n
質問者

補足

すいません。まだよくわからないのですが、引数を与える場合、何か関数を作成し、main(1,4)などとして与えるのですか? よろしくお願いします。

関連するQ&A