

main(int argc, char *argv[])
while(--argc > 0) {
if(**(++agv) == '-') {
switch(argv[0][1]){
case 'a';
オプションaに対する処理;
break;
case 'b';
オプションbに対する処理;
break;
case 'c';
オプションcに対する処理;
break;
default;;
abc 以外のオプションが入力された時の処理;
}
} else
break;
}
オプション以外のパラメータが入力されたときの処理;
特に ’**’の部分や argv[0][1]の意味が解かりません。
よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
ポインタに*を付けたら、そのポインタが示す先のものになるのは、おわかりですか?(ポインタ操作の基本です)
ポインタPが示す先がポインタなら、 *pはポインタになります。
**pは *(*p)、つまり ポインタ*pの示す先、ということになります。
また、 *p = p[0] , *(p+1) = p[1] という、ポインタは1次元配列のようになるのもおわかりですね?(これもポインタ操作の基本)
同様に、**p → *(p[0]) → p[0][0] となります。
あるいは **p → (*p)[0] → p[0][0] となります。
ポインタへのポインタは二次元配列のように扱えます。
> main(int argc, char *argv[])
のように書くと、コマンドライン引数に関する情報がargc,argvに入ります。
第1引数argcは引数の数です。コマンドだけなら1、引数が一つ付くと2,以下3,4,..となります。
第2引数argvは 引数の文字列の列です。
argv[0] に実行ファイルそのものを表す文字列
argv[1] に最初の引数、以下argv[2]...と続きます。
また、文字列なので、charの配列として扱えます。
argv[0][0]は コマンドの最初の文字になります。
> if(**(++argv) == '-') {
ここでは、まず、argvを一つ増やします。それにより、いままでargv[0]を指していたポインタ変数argvが、元のargv[1]つまり第1引数の文字列を指すようになります。
そこで、**argv →argv[0][0]です。文字列argv[0]の1文字目です。元のargv[1]つまり第1引数の文字列の1文字目です。
>switch(argv[0][1]){
上と同様に、文字列argv[0]の2文字目です。元のargv[1]つまり第1引数の文字列の2文字目です。
これをargc回ずらしてループします。
No.4
- 回答日時:
みなさんからの回答をもとに図化してみると、
理解度が増すかもしれません。
No.2
- 回答日時:
まず **(++argv) ですが、文字列配列 argv が現在指している位置の次の文字列の先頭文字をポイントします。
実際には、複数あるコマンドラインオプションの先頭が '-' であるかどうかを調べる if 文です。次に argv[0][1] ですが、配列 argv の現在指している位置の先頭から2番目の文字をポイントします。実際には、コマンドラインオプションの '-' の次の文字をポイントしています。
No.1
- 回答日時:
main関数の引数のargvは
char *argv[]
と宣言されています。
これは、argvはchar *、すなわちchar型へのポインタの配列ということです。
また、配列の名前だけ取り出したものは、配列の先頭へのポインタとなるので、argvは「char型へのポインタ」へのポインタとして働きます。
したがって *argvは「char型へのポインタ」を示し、**argvはその「char型へのポインタ」が指すchar型のデータを指すことになります。
同様に、ポインタは配列の先頭として働くので、argv[n]のように添字を付けることで配列のようにデータを扱えます。
したがって、argv[m][n]は、m番目の「char型へのポインタ」の指す領域のn番目のchar型データということになります。
ここではargvはコマンドライン文字列を指してるので、実際にはmは0以外の値にはならないはずですが、これと同じような形で2次元配列を表すことが出来ます。
argv[0][n]は、(*argv)[n]と同義です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
init関数の意味
-
関数へのポインタ渡し
-
教えてください2
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
コンストラクタでnewを失敗した...
-
トリプルポインタが必須!とな...
-
c言語で任意のファイルから読み...
-
線形リストについて。
-
ExcelVBAでのkernel32(64bit)
-
ポインタの基礎について
-
Win32 APIウィンドウプロシージ...
-
"関数の中でnewで初期化したポ...
-
プーさんのマウスポインタを教...
-
C言語のポインタに直接アドレス...
-
C++のnew演算子について質問です。
-
2分探索木、挿入
-
UNIXプログラミング execに...
-
ポインタ変数のインクリメント
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
fopne で失敗する原因
-
PASCALとFARの意味
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
プーさんのマウスポインタを教...
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
自作DLLの引数について、ポイン...
-
NULLポインタが0でない処理系と...
-
TCHAR文字列内の検索について
おすすめ情報