重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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]の意味が解かりません。
よろしくお願い致します。

A 回答 (4件)

ポインタに*を付けたら、そのポインタが示す先のものになるのは、おわかりですか?(ポインタ操作の基本です)


ポインタ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回ずらしてループします。
    • good
    • 0
この回答へのお礼

すごく丁寧な解答を、ありがとうございます。
勉強になりました。

お礼日時:2010/04/17 09:21

みなさんからの回答をもとに図化してみると、


理解度が増すかもしれません。
    • good
    • 0
この回答へのお礼

御指導ありがとうございます。
勉強になります。

お礼日時:2010/04/17 09:22

まず **(++argv) ですが、文字列配列 argv が現在指している位置の次の文字列の先頭文字をポイントします。

実際には、複数あるコマンドラインオプションの先頭が '-' であるかどうかを調べる if 文です。

次に argv[0][1] ですが、配列 argv の現在指している位置の先頭から2番目の文字をポイントします。実際には、コマンドラインオプションの '-' の次の文字をポイントしています。
    • good
    • 0
この回答へのお礼

アルゴリズムまで説明していただき、ありがとうございます。
誠にありがとうございました。

お礼日時:2010/04/17 09:17

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]と同義です。
    • good
    • 0
この回答へのお礼

ポインタと配列の関係について、ありがとうございます。
丁寧な御教授ありがとうございました。

お礼日時:2010/04/17 09:15

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