新しく質問する

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

役に立った:2件
  • 質問者:taroimoten
  • 投稿日時:2001/08/28 10:37
  • 困り度:困ってます
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

こんにちは.つね日ごろ思っている質問させてください.
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関数の意味と,その使い方について
アドバイスお願い致します.

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:2件)
  • 参考になった:0件
  • 回答者:a-kuma
  • 回答日時:2001/08/28 21:13

> 環境変数とは、どういったもので、

Turbo C を使っているならば、コマンドプロンプトを意識してますよね。
あの OS の環境変数がそっくり渡ってきます。

set コマンドで表示される PATH だとか TEMP だとかっていう、あれ、です。

通報する

この回答へのお礼

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

それでは★

  • 参考になった:0件

No.4ベストアンサー20pt

  • 回答者:a-kuma
  • 回答日時:2001/08/28 19:42

> (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 が無いと、返り値が不定になるよ、と警告を出している
のでしょう。

通報する

この回答へのお礼

a-kumaさま、詳しい説明ありがとうございましたっ!!


>因みに三番目の形式では、三つ目の引数には環境変数が入ります。
>以下のようなコードで確認ができます。

↑の環境変数とは、どういったもので、またその機能とか
おしえてもらえませんでしょうか?

よろしくお願いします!

  • 参考になった:0件
  • 回答者:nakashi
  • 回答日時:2001/08/28 11:47

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

通報する

  • 参考になった:0件
  • 回答者:cherry_moon
  • 回答日時:2001/08/28 11:30

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++;
}

で確認してみてください。

通報する

  • 参考になった:0件

No.1ベストアンサー10pt

  • 回答者:Haizy
  • 回答日時:2001/08/28 10:47

こんにちは。

>特に(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をやる上で、必要なところなんで。
でわでわ。

通報する

この回答への補足

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は役に立ちましたか?(役に立った:2件)

このページのトップへ

Facebook公式ページ

公式Twitter