ページ 1 / 1
無題
Posted: 2010年1月07日(木) 07:20
by かんたべ君
おはようございます。
C言語で分からないことがあったので質問させていただきます。
WindowsのVistaでBorland C++を使っています。
プログラムの中から抜粋したコードです。
int main(int argc, char *argv[/url])
{
int width = 8;
FILE *fp;
if (argc < 2) {
datab(stdin, stdout, width);
}
else {
while (--argc > 0) {
if (**(++argv) == '-') {
width = atoi(++*argv);
}
・・・・
・・・・
この中で **(++argv)とあるのですが、これはどんな動きをするのですか?
argvはポインタですよね。++argvなので、argv[1]を指しますよね?
ということは、**(argv[1])になりますよね?*(argv[1])だと、そのポインタが指す中身なのですが、
*二つあります。これは、どういうことなのでしょうか?
Re:無題
Posted: 2010年1月07日(木) 07:40
by MNS
*(argv[1])がargv[1]の値を指す、ということは、**(argv[1])はargv[1][0]の値をさします。
Re:無題
Posted: 2010年1月07日(木) 07:44
by box
そのプログラムは
実行ファイル名 -4
のように、実行ファイル名の後ろにハイフン付きの
数値オプションを付けて、
何かの幅を指定するようになっているものですか?
++argv:お考えのとおり、argv[1]を指します。
*(++argv):argv[1]が指している文字列、つまり"-4"のことです。
**(++argv):argv[1]が指している文字列"-4"の先頭文字、つまり'-'のことです。
つまり、
if (**(++argv) == '-') {
width = atoi(++*argv);
}
このif文は、
実行ファイル名の直後に指定したオプションが「ハイフンの直後に数値」の形であれば、
数値の部分を変数widthに格納する、という意味です。
atoi(++*argv)
の部分は、
*argv:argv[1]が指している文字列、つまり"-4"のことです。
++*argv:ポインタargv[1]を1文字分進めて、"4"を指します。
atoi(++*argv):atoi("4")を実行して、文字列の"4"から数値の4を得ます。

Re:無題
Posted: 2010年1月07日(木) 08:42
by かんたべ君
MNSさん、boxさん回答ありがとうございます。
すいません、このプログラムが何のプログラムか説明していませんでした。
このプログラムは、"test.c"という名前のファイルをタブ幅4で表示するそうです。実行は
> detab -t4 test.c
あと、boxさん、申し訳ございません。if (*++(*argv) == 't')が抜けていました。
if (**(++argv) == '-') {
if (*++(*argv) == 't') {
width = atoi(++*argv);
}
}
boxさんに質問です。
*(++argv):argv[1]が指している文字列、つまり"-4"のことです。
**(++argv):argv[1]が指している文字列"-4"の先頭文字、つまり'-'のことです。
と、あったのですが、
*(argv[1])だけで、先頭文字'-'は指さないのですか?
Re:無題
Posted: 2010年1月07日(木) 09:02
by MNS
なんか、間違えていた気がします。
*(argv[1])で確かに'-'はさしますね。
追記:
>argvはポインタですよね。++argvなので、argv[1]を指しますよね?
>ということは、**(argv[1])になりますよね?*(argv[1])だと、そのポインタが指す中身なのですが、
すいません、先程の回答は誤っていました。この時点で違いますね。
(++argv)=argv[1]ではありません。++argv=&argv[1]です。
つまり、*(++argv)=argv[1]です。
>*(argv[1])だけで、先頭文字'-'は指さないのですか?
よって、*(*(++argv))=*(argv[1])ですから、合っています。
