5.10 コマンド行の引数, 演習5-11, 演習5-12 K&R プログラミング言語C
2010年02月13日
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規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726