5.10 コマンド行の引数, 演習5-11, 演習5-12 K&R プログラミング言語C

5.10 コマンド行の引数

argc は、コマンド名 + 引数の数
argv は、コマンド引数の文字列配列を指すポインタの配列を指すポインタ

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("argc => %d\n", argc);

    while (argc-- > 0) {
        printf("  argv  => %p\n", argv);   /* コマンド引数の文字列配列を指すポインタの配列を指すポインタ */
        printf(" *argv  => %p\n", *argv);  /* コマンド引数の文字列配列(ポインタを表示) */
        printf(" *argv  => %s\n", *argv);  /* コマンド引数の文字列配列(文字列を表示) */
        printf("**argv  => %c\n", **argv); /* コマンド引数の文字列配列の先頭要素(先頭文字を表示) */
        printf("(*argv)[1]  => %c\n", (*argv)[1]); /* コマンド引数の文字列配列の2番目要素(2番目の文字を表示) */
        printf("----------\n");
        argv++; /* ポインタを次の引数へ */
    }

    return 0;
}

実行結果

$ ./args hello world
argc => 3
  argv  => 0xbfac7dd4
 *argv  => 0xbfac9129
 *argv  => ./args
**argv  => .
(*argv)[1]  => /
----------
  argv  => 0xbfac7dd8
 *argv  => 0xbfac9130
 *argv  => hello
**argv  => h
(*argv)[1]  => e
----------
  argv  => 0xbfac7ddc
 *argv  => 0xbfac9136
 *argv  => world
**argv  => w
(*argv)[1]  => o
----------

演習5-11

entab

#include <stdio.h>
#include <stdlib.h>

#define DEFAULT_TABSTOP 4
#define IS_BLANK 1
#define NOT_BLANK 0

int main(int argc, char *argv[])
{
    int c, count, n, is_blank;

    n = (argc > 1) ? atoi(*++argv) : DEFAULT_TABSTOP;

    is_blank = IS_BLANK;
    count = 0;
    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            is_blank = IS_BLANK;
            if (++count == n) {
                putchar('\t');
                count = 0;
            }
        } else {
            if (is_blank) {
                while (count > 0) {
                    putchar(' ');
                    count--;
                }
            }
            is_blank = NOT_BLANK;
            putchar(c);
        }
    }

    return 0;
}

detab

#include <stdio.h>
#include <stdlib.h>

#define DEFAULT_TABSTOP 4

int main(int argc, char *argv[])
{
    int c, i, n, sp;

    n = (argc > 1) ? atoi(*++argv) : DEFAULT_TABSTOP;

    i = 0;
    while ((c = getchar()) != EOF) {
        if (c == '\t') {
            sp = n - i;
            while (sp > 0) {
                putchar(' ');
                sp--;
            }
            i = 0;
        } else if (c == '\n' || i + 1 == n) {
            putchar(c);
            i = 0;
        } else {
            putchar(c);
            ++i;
        }
    }

    return 0;
}

演習5-12

問題の意味がよくわからなかったので、引数の処理部分のみとする。

#include <stdio.h>
#include <stdlib.h>

#define TAB_SIZE 4

int main(int argc, char *argv[])
{
    int tab[2] = { TAB_SIZE, TAB_SIZE };
    int tb;

    while (--argc > 0 && (**++argv == '-' || **argv == '+')) {
        switch (**argv) {
        case '-':
            if ((tb = atoi(*argv + 1)) > 0)
                tab[0] = tb;
            break;
        case '+':
            if ((tb = atoi(*argv + 1)) > 0)
                tab[1] = tb;
            break;
        }
    }

    printf("-m:%d, +n:%d\n", tab[0], tab[1]);

    return 0;
}

実行結果

$ ./ex5-12
-m:4, +n:4
$ ./ex5-12 -7 +13
-m:7, +n:13
$ ./ex5-12 +21 -45
-m:45, +n:21
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»