無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かんたべ君

無題

#1

投稿記事 by かんたべ君 » 15年前

おはようございます。
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])だと、そのポインタが指す中身なのですが、
*二つあります。これは、どういうことなのでしょうか?

MNS

Re:無題

#2

投稿記事 by MNS » 15年前

*(argv[1])がargv[1]の値を指す、ということは、**(argv[1])はargv[1][0]の値をさします。

box

Re:無題

#3

投稿記事 by box » 15年前

そのプログラムは

実行ファイル名 -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:無題

#4

投稿記事 by かんたべ君 » 15年前

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])だけで、先頭文字'-'は指さないのですか?

MNS

Re:無題

#5

投稿記事 by MNS » 15年前

なんか、間違えていた気がします。
*(argv[1])で確かに'-'はさしますね。

追記:
>argvはポインタですよね。++argvなので、argv[1]を指しますよね?
>ということは、**(argv[1])になりますよね?*(argv[1])だと、そのポインタが指す中身なのですが、
すいません、先程の回答は誤っていました。この時点で違いますね。
(++argv)=argv[1]ではありません。++argv=&argv[1]です。
つまり、*(++argv)=argv[1]です。


>*(argv[1])だけで、先頭文字'-'は指さないのですか?
よって、*(*(++argv))=*(argv[1])ですから、合っています。 画像

閉鎖

“C言語何でも質問掲示板” へ戻る