ページ 11

無題

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])ですから、合っています。 画像