開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: C
- Clang (コンパイラ)
プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第5章(ポインタと配列)、5.10(コマンド行の引数)、演習5-13を解いてみる。
その他参考書籍
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
演習 5-13.
コード
sample.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLEN 1000 #define MAXLINES 5000 int main(int argc, char *argv[]) { int n, nlines, len, i; char *p; char line[MAXLEN]; char *lineptr[MAXLINES]; int my_getline(char *, int); char *alloc(int); if (argc == 1) { n = 10; } else if (argc == 2 && (*++argv)[0] == '-') { n = atoi(argv[0] + 1); } else { printf("コマンドライン引数が「-整数」ではない\n"); return 1; } if (n < 1) { printf("コマンドライン引数が正の整数ではない\n"); return 1; } nlines = 0; while ((len = my_getline(line, MAXLEN)) > 0) { p = alloc(len); line[len - 1] = '\0'; strcpy(p, line); lineptr[nlines++] = p; } if (n > nlines) { n = nlines; } for (i = nlines - n; i < nlines; i++) { printf("%2d行: %s\n", i + 1, lineptr[i]); } return 0; } int my_getline(char *s, int lim) { int c; char *t; t = s; while (--lim > 0 && (c = getchar()) != EOF && c != '\n') { *s++ = c; } if (c == '\n') { *s++ = c; } *s = '\0'; return s - t; } #define ALLOCSIZE 10000 char allocbuf[ALLOCSIZE]; char *allocp = allocbuf; char *alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; }
入出力結果(Terminal)
$ ./a.out < sample.c
64行: char allocbuf[ALLOCSIZE];
65行: char *allocp = allocbuf;
66行:
67行: char *alloc(int n)
68行: {
69行: if (allocbuf + ALLOCSIZE - allocp >= n) {
70行: allocp += n;
71行: return allocp - n;
72行: } else
73行: return 0;
74行: }
$ cc sample.c
$ ./a.out < sample.c
65行: char *allocp = allocbuf;
66行:
67行: char *alloc(int n)
68行: {
69行: if (allocbuf + ALLOCSIZE - allocp >= n) {
70行: allocp += n;
71行: return allocp - n;
72行: } else
73行: return 0;
74行: }
$ ./a.out -5 < sample.c
70行: allocp += n;
71行: return allocp - n;
72行: } else
73行: return 0;
74行: }
$ ./a.out -100 < sample.c
1行: #include <stdio.h>
2行: #include <stdlib.h>
3行: #include <string.h>
4行:
5行: #define MAXLEN 1000
6行: #define MAXLINES 5000
7行:
8行: int main(int argc, char *argv[])
9行: {
10行: int n, nlines, len, i;
11行: char *p;
12行: char line[MAXLEN];
13行: char *lineptr[MAXLINES];
14行: int my_getline(char *, int);
15行: char *alloc(int);
16行:
17行: if (argc == 1) {
18行: n = 10;
19行: } else if (argc == 2 && (*++argv)[0] == '-') {
20行: n = atoi(argv[0] + 1);
21行: } else {
22行: printf("コマンドライン引数が「-整数」ではない\n");
23行: return 1;
24行: }
25行: if (n < 1) {
26行: printf("コマンドライン引数が正の整数ではない\n");
27行: return 1;
28行: }
29行: nlines = 0;
30行: while ((len = my_getline(line, MAXLEN)) > 0) {
31行: p = alloc(len);
32行: line[len - 1] = '\0';
33行: strcpy(p, line);
34行: lineptr[nlines++] = p;
35行: }
36行: if (n > nlines) {
37行: n = nlines;
38行: }
39行: for (i = nlines - n; i < nlines; i++) {
40行: printf("%2d行: %s\n", i + 1, lineptr[i]);
41行: }
42行: return 0;
43行: }
44行:
45行:
46行: int my_getline(char *s, int lim)
47行: {
48行: int c;
49行: char *t;
50行:
51行: t = s;
52行: while (--lim > 0 && (c = getchar()) != EOF && c != '\n') {
53行: *s++ = c;
54行: }
55行: if (c == '\n') {
56行: *s++ = c;
57行: }
58行: *s = '\0';
59行: return s - t;
60行: }
61行:
62行: #define ALLOCSIZE 10000
63行:
64行: char allocbuf[ALLOCSIZE];
65行: char *allocp = allocbuf;
66行:
67行: char *alloc(int n)
68行: {
69行: if (allocbuf + ALLOCSIZE - allocp >= n) {
70行: allocp += n;
71行: return allocp - n;
72行: } else
73行: return 0;
74行: }
$
0 コメント:
コメントを投稿