• ベストアンサー

int main(int argc, char* argv[]) についての質問

こんにちは.つね日ごろ思っている質問させてください. Cの参考書には, (1) void main(void) { } (2) int main(int argc, char* argv[]) { return 0; } の2つのパターンが記載されていますが, どういう違いがあるのでしょうか? (1)の場合main関数は,型を持たず,引数も持たない. ※Turbo Cなどのコンパイラーでは, return文がないと警告出ます. (2)の場合は,int 型をかえし,引数はint型 変数と char型ポインタ配列(?) を指定している. といったくらいしか分かりません. (2)に関してもう少し述べれば, コマンドラインからファイルを指定し,実行することが できると勉強した記憶があるのですが, 理解があいまいです. 特に(2)の場合のmain関数の意味と,その使い方について アドバイスお願い致します.

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.4

> (1) > void main(void)   ... > (2) > int main(int argc, char* argv[])   ... > の2つのパターンが記載されていますが,どういう違いがあるのでしょうか? (1) は、間違いです。少なくとも ANSI-C の規格に合致していません。 main() は、特別な関数で、ANSI-C の規格では以下の三通りのうちのどれか でなくてはいけない、と定められています。 int main(void) int main(int argc, char *argv[]); int main(int argc, char *argv[], char *envp[]); 因みに三番目の形式では、三つ目の引数には環境変数が入ります。 以下のようなコードで確認ができます。 int main(int argc, char *argv[], char *envp[]) {   int i = 0;   while (envp[i]) {     printf("envp[%d] = '%s'\n", i, envp[i]);     ++i;   }   return 0; } > ※Turbo Cなどのコンパイラーでは,return文がないと警告出ます Turbo C は、規格に厳格なのでしょう。返り値が void なのはおかしいので、 int だとみなすよ、という警告も出てるはず。で、int が帰り値だとみなし ているので return が無いと、返り値が不定になるよ、と警告を出している のでしょう。

taroimoten
質問者

お礼

a-kumaさま、詳しい説明ありがとうございましたっ!! >因みに三番目の形式では、三つ目の引数には環境変数が入ります。 >以下のようなコードで確認ができます。 ↑の環境変数とは、どういったもので、またその機能とか おしえてもらえませんでしょうか? よろしくお願いします!

その他の回答 (4)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

> 環境変数とは、どういったもので、 Turbo C を使っているならば、コマンドプロンプトを意識してますよね。 あの OS の環境変数がそっくり渡ってきます。 set コマンドで表示される PATH だとか TEMP だとかっていう、あれ、です。

taroimoten
質問者

お礼

a-kumaさん、たびかさなる解説ありがとうございます。 a-kumaさんの解説は非常にわかりやすくて理解することができました。 教えていただいたことをもとにもっと知識を深めたいと思います。 どうもありがとうございました。 なお、他のアドバイス頂いた方々に感謝いたします!! それでは★

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.3

VCの場合は void main(int argc, char **argv) {   for (int lLoop = 0; lLoop<argc; lLoop++) {    printf("argv[%d] = %s\n",lLoop,argv[lLoop]);   } } test aaa bbb ccc argv[0] = C:\C++OO\test\Debug\test.exe argv[1] = aaa argv[2] = bbb argv[3] = ccc

参考URL:
//http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/vccore/_langref_main.2c_.wma
回答No.2

argc: 4 argv[0]: program.exe argv[1]: aaa.txt argv[2]: bbb.txt argv[3]: ccc.txt です。 i=0; while(argv[i]!=NULL){ printf("argv[%d]: %s\n", i, argv[i]); i++; } で確認してみてください。

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.1

こんにちは。 >特に(2)の場合のmain関数の意味と,その使い方について 書籍にもあると思いますが、プログラムに渡す「コマンドライン引数」です。 argcには、渡された引数の数 argvには、渡された引数の文字列 画格納されています。 argc[0] には、最初の引数 argv[argc -1←(配列は0から始まる為)]には、最後の引数が入ります。 例) program.exe aaa.txt bbb.txt ccc.txt というのは argc[0] には、"aaa.txt" argv[argc -1] "ccc.txt" が、格納されます。 感じ掴めますか? がんばってくださいね。Cをやる上で、必要なところなんで。 でわでわ。

taroimoten
質問者

補足

Haizyさん,さっそくのアドバイスありがとうございます. int main(int argc, char* argv[]) の引数は,Haizyさんの示した以下の例, 例) program.exe aaa.txt bbb.txt ccc.txt では, argc には,渡された引数の数,具体的には,aaa.txt,bbb.txt,ccc.txtの合計 数,3が代入されることになり, argv[0] には, aaa.txt argv[1] には, bbb.txt argv[2] には, ccc.txt が代入されるという理解で正しいでしょうか??

関連するQ&A

  • main(int argc,char **argv[])の意味を教えて下さい

     今晩は、Cの初心者です宜しくお願いします。  main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、 「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。 また、必ずポインタ型でとるという決まりでしょうか。 宜しくお願いします。

  • main の引数には const 付けた方が

    C言語での質問です。 引数を取るような main 関数は int main( int argc, char *argv[]){~} とされていますが、argvの指す文字列を変更する、というのはいくら何でもまずいので、 int main( int argc, const char *argv[]){~} あるいは int main( int argc, const char const * const * argv){~} の方がいいのではないでしょうか? 何故、constを付けない形が出回っているのでしょうか?

  • main関数について

    最近C言語を勉強し始めた者です。 main関数について分からないことがあるので質問致します。main関数は自作関数ですよね。ということは自由に引数を決めていいのですか?つまり int main(int argc , char *argv[]) 以外の引数を決めることは出来るのでしょうか。

  • main関数のとる引数(argc , *argv[])の意味について

     今日は、Cの初心者です宜しくお願いします。    main関数(main(int argc , *argv[]))のとる引数、argcのCと*argv[]のVはどのような意味の略なのでしょうか、 なにか意味があるようなきがするのですが。  宜しくお願いします。

  • 引数の渡し方と受け方(argv)

    メインで引数をもらい、それをパラメタチェック関数に 渡す場合、どのような形で渡せばいいですか? ※メインでargvを変数に格納しないで、 そのままargvを関数に渡す方法が分かりません。 int prm_chk(char *argv[]) { /* 処理省略 */ } int main (int argc, char *argv[]) { /* 処理省略 */ /* 以下のパラメタ(argv)の渡し方 */ if(prm_chk(*argv[]) != 0){ exit(-1); } exit(0); }

  • main( )

    次の様なプログラムを作りました。 Dosプロンプトを開き、コンパイルで出来た、exeファイルのアドレスを渡しました。 例えば、2と3を引数として渡す時、 2 スペースを押す、 3 enter  の順に行うと、エラーになります。 どの様に、引数を渡すのか操作方法を教えてください。 お願いします。 #include<stdlib.h> #include<stdio.h> int main(int argc, char *argv[]) {    if(argc!=3){     printf("2つの数を指定してください。");     exit(1);    }     printf("%f",atoi(argv[1])+atoi(argv[2]));    return 0; }

  • main関数の事についてお聞きします。

    Windowsのプログラムを書くとき、下のようにキッチリ戻り値や引数を書かなくてはならないのに int WINAPI WinMain( HINSTANCE hInstance, // 現在のインスタンスのハンドル HINSTANCE hPrevInstance, // 以前のインスタンスのハンドル LPSTR lpCmdLine, // コマンドライン int nCmdShow // 表示状態 ); C言語で書かれたプログラムは int main(int argc, char *argv[]) ではなく、 int main(void) や void main(void) または int main() や main() だけのモノなど、 いろいろです。 main関数は、関数なのに戻り値や引数を省略して書ける仕様なのは、なぜなのか? ちょっと疑問に思ったのでこちらにお尋ねしました。

  • コマンドライン引数 *argv[]はなぜポインタ?

    C言語初心者です。 コマンドライン引数、 int main(int argc, char *argv[]) というのを最近勉強しましたが、引数2番目がポインタになっている理由について、 どなたか教えて下さい。 そういう仕様なんだから、それに従いましょう、ということでしょうか? int main(int argc, char argv[]) では、ダメなのでしょうか? このポインタでの引数渡しについて、 なんらかの納得のいく考え方をご存知の方がいらしたら、教えて下さい。 宜しくお願い致します。

  • c言語

    (c++ではなくC89準拠) c言語について質問 (1) 関数名()と関数名(void)は違う意味 (2) mainの引数の型は(void)か(int argc, char *argv[]) (3) K&Rは標準c準拠でmain()という表記があります ということは、(1)の関数名とはmain以外の関数名で、 main()とmain(void)は同じなんでしょうか。

  • main()とint main(void)の違い

    最初main()と習ったのですが、最近学校でmain()ではなくint main(void)を使うように なりました。 どのように違うのでしょうか? main関数のところに引数が入っている意味がわかりません。 (void)ってなんですか? そもそも引数って何ですか? あと、プログラムの最後にreturn(0)って書いてあるんですが、これはどういう意味ですか? 回答よろしくお願いします。

専門家に質問してみよう