プロが教える店舗&オフィスのセキュリティ対策術

こんにちは.つね日ごろ思っている質問させてください.
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 回答 (5件)

> (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 が無いと、返り値が不定になるよ、と警告を出している
のでしょう。
    • good
    • 0
この回答へのお礼

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


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

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

よろしくお願いします!

お礼日時:2001/08/28 20:18

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



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

set コマンドで表示される PATH だとか TEMP だとかっていう、あれ、です。
    • good
    • 0
この回答へのお礼

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

それでは★

お礼日時:2001/08/29 10:06

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
    • good
    • 0

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

で確認してみてください。
    • good
    • 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をやる上で、必要なところなんで。
でわでわ。

この回答への補足

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

が代入されるという理解で正しいでしょうか??

補足日時:2001/08/28 11:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!