こんにちは.つね日ごろ思っている質問させてください.
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関数の意味と,その使い方について
アドバイスお願い致します.
No.5
- 回答日時:
> 環境変数とは、どういったもので、
Turbo C を使っているならば、コマンドプロンプトを意識してますよね。
あの OS の環境変数がそっくり渡ってきます。
set コマンドで表示される PATH だとか TEMP だとかっていう、あれ、です。
a-kumaさん、たびかさなる解説ありがとうございます。
a-kumaさんの解説は非常にわかりやすくて理解することができました。
教えていただいたことをもとにもっと知識を深めたいと思います。
どうもありがとうございました。
なお、他のアドバイス頂いた方々に感謝いたします!!
それでは★
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 が無いと、返り値が不定になるよ、と警告を出している
のでしょう。
a-kumaさま、詳しい説明ありがとうございましたっ!!
>因みに三番目の形式では、三つ目の引数には環境変数が入ります。
>以下のようなコードで確認ができます。
↑の環境変数とは、どういったもので、またその機能とか
おしえてもらえませんでしょうか?
よろしくお願いします!
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
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++;
}
で確認してみてください。
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をやる上で、必要なところなんで。
でわでわ。
この回答への補足
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 関数へのポインタを返す関数 2 2022/02/05 22:12
- C言語・C++・C# C#のラムダ式に関する質問です 2 2021/12/19 23:04
- C言語・C++・C# 関数へのポインタ 3 2022/02/04 17:20
- Java javaのmaxを使ったプログラムについて 2 2021/10/27 16:25
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 次のプログラムでは、配列yの中に数値0,1,2がいくつあるか数えて実行例のように出力するプログラムの 1 2021/11/15 20:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報