はじめまして。
C言語を学習しています。
PCのOSはWindows XPです。
参考書に、アプリケーションの動作を指定するオプションを指定する方法として、下記の説明とプログラムが載っています。
以下の点でつまづいており、ご教示をお願い致します。
1、プログラム実行結果画面(コマンドプロンプトのような黒い画面。スクリーンショットを添付しております。)に【-a】と入力しようとしましたが、テンキーの【-】を押した時点で画面が消えてしまいます。
どのように操作すれば、参考書のような実行結果が得られるのでしょうか。
2、【argc--;】の部分で、ここでなぜデクリメントを使うのでしょうか。
3、argvは文字配列へのポインタ変数とのことですが、if文のところの【argv[argc][0]】が何を意味しているのか教えてください。
argv[配列の要素]のような書き方ではなく、argvの横に[]が2つある時点で混乱してしまいます。
どうかよろしくお願い致します。
●参考書による説明
一般的に、コマンドラインにはファイル名の他に、アプリケーションの動作を指定するオプションを指定することがあります。
例えば、Windowsでファイル名を指定して実行で defrag と指定して起動すると、デフラグが起動して何もせずに終了しますが、
defrag c: と指定すると、Cドライブのデフラグを開始します。
また、defrag c: -a と指定すると、Cドライブの分析結果だけを表示します。
このような使い方は、パソコン上級者にはおなじみのやり方です。
この例では、 c: と -a という2つの文字列がコマンドラインに渡され、それをアプリケーション内で解析して、動作を決定しています。
同様のことは、コマンドラインの文字列を調べれば簡単にわかります。
ここでは、-a と -s というオプションの有無を解析する例です。
●プログラム
#include <stdio.h>
int main(int argc,char *argv[])
{
while (argc > 0) {
argc--;
if (argv[argc][0] == '-') {
if (argv[argc][1] == 'a') printf("-a オプション\n");
if (argv[argc][1] == 's') printf("-s オプション\n");
}
}
return 0;
}
このプログラムに -a -s というオプションを与えて実行した結果は次の通りです。
-a オプション
-s オプション
同様にすれば、いくつのオプションにでも対応することができます。
また、先頭が - ではない文字列をファイル名として扱うようにすれば、
ファイル名も前項と同様に取得することができます。
No.3ベストアンサー
- 回答日時:
コマンドラインというのは、「実行するときに指定」するものです。
例えば
XXXXX.exe -a -s
等というように。
別質問でfgetsで読みこんだような、「実行しててから入力」ではありません。
こっちは
XXXXX.exe ←コマンドライン
-a ← ここはプログラム実行中
-s ← ここはプログラム実行中
という感じです。
今、Visual Studio を使っていて、いるのではないでしょうか?
Visual Studioから「実行」「デバッグ実行」した場合、標準では後者のような「コマンドライン引数無し」の状態で実行します。
この後に 「-」 とキー入力しても、既にプログラムは実行されているので「コマンドライン引数」にはなりません。
さらに、その画面表示は、プログラムが終了した状態です。
コマンドライン引数を指定するには、プロジェクトのプロパティの「デバッグ」欄から行います。
あるいは、コマンドプロンプトから、引数を付けて実行します。
標準では、プロジェクトの下のDebugまたはReleaseフォルダに実行ファイルができるので、CDコマンドで実行ファイルのあるフォルダに移動して
実行ファイル 引数
の形で実行してください。
こちらの方法だと、引数を変えて実行するのも簡単なので、引数を変えたら、結果がどうなるかいろいろ試して理解してください。
(2)
int main(int argc, char * argv[])
とすると
argc: argvの長さ=実行コマンドと引数の数
argv: 実行コマンド(argv[0])と引数(argv[1]~)
となります。
char* argv[argc] ;
と配列宣言したようなイメージです。
argcをそのまま変更しているからややこしいので、次のように変えます。
int a = argc ;
while (a > 0) {
a--;
printf("a: %d , argc: %d\n",a,argc);
if (argv[a][0] == '-') {
if (argv[a][1] == 'a') printf("-a オプション\n");
if (argv[a][1] == 's') printf("-s オプション\n");
}
}
これなら、デクリメントする意味がわかるのでは無いでしょうか?
※ でもなんで、後からやるんだろう?
引数は先頭から処理するのが普通ですし
for( a=1; a<argc ; a++ ){ argvの処理 }
とかの方がわかりやすいと思うのですが。
※※ 前回の質問のと合せて、その参考書、サンプルコードがあまりよくない気がします。
(3)
配列、ポインタのことは、よく理解してください。この先ずーっとついてまわります。
・関数の定義に使う char * argv[] は char **argv と同じです。
ということは
argv : char ** 型
*(argv+X) / argv[X] : char *型
*(*(argv+X)+Y) / argv[X][Y] : char 型
→ char* argvX = *(argv+X) ; とすると
*(argvX+Y) / argvX[Y] : char 型
です。混乱したら、一つずつ分解して、順番に考えることです。
No.2
- 回答日時:
こんにちは。
下記サイトにコマンドライン文字列がどのようにargvに格納されるかが載っています。
http://ratan.dyndns.info/MicrosoftVisualC++/file …
では。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
他のPC上にあるexeを、そのP...
-
Excel VBA から外部プログラム...
-
一定時間たつと、リセットしたい
-
VB6とExitProcess
-
コマンドプロンプト上で動作す...
-
プロセス間通信について
-
VB上で実行中の無限ループの止め方
-
sleep()関数について
-
ヘッダファイル? malloc.hと...
-
vba GetAsyncKeyState関数について
-
sendkeysにてALT+CTRL+INSERTを...
-
ラズパイ プログラム 自動起動 ...
-
timeEndPeriodを呼ばないと
-
C言語で途中までしか、プログラ...
-
バックグラウンドで実行される...
-
これて逆じゃないですか?
-
緯度、経度の 10進法と 60進法...
-
C言語で、メモリを解放しないで...
-
TCP/IP通信時のサーバーからの受信
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
sendkeysにてALT+CTRL+INSERTを...
-
他のPC上にあるexeを、そのP...
-
実行時エラー429
-
system関数を使用してsuコマン...
-
プログラミング ソースコード
-
C言語で途中までしか、プログラ...
-
MACで動く実行ファイルをWindow...
-
clock関数は正確じゃないの?
-
あるプログラム実行中に別のプ...
-
VBAで外部プログラムを非表示で...
-
並列計算をしたときのシステム...
-
システム資源とは?
-
C言語でフォルダを開く
-
終了してもプログラムが実行し...
-
Windows10でDOSゲーム
-
なんかC言語でプログラム書いて...
-
プロセス間通信について
-
プログラムを走らせる
-
RPG パラメーターについて
おすすめ情報