開発環境
- 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 MAXLINES 5000 #define MAXLEN 1000 #define MAXSTOR 5000 #define ALLOCSIZE 10000 void tail(int argc, char *argv[]); int readlines(char *lineptr[], int nlines); int my_getline(char *, int); char *alloc(int); char allocbuf[ALLOCSIZE]; char *allocp = allocbuf; int main(int argc, char *argv[]) { tail(argc, argv); return 0; } void tail(int argc, char *argv[]) { int n, nlines, i; char *lineptr[MAXLINES]; if (argc == 1 || (*++argv)[0] != '-') { n = 10; } else n = atoi(&(*argv)[1]); if ((nlines = readlines(lineptr, MAXLINES)) >= 0) { if (n > nlines) n = nlines; for (i = nlines - n; i < nlines; i++) printf("%2d行目、%2d行: %s\n", (n + 1) - (nlines - i), i + 1, lineptr[i]); } else printf("error: input too big\n"); } int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = my_getline(line, MAXLEN)) > 0) { if (nlines >= maxlines || (p = alloc(len)) == NULL) return -1; else { line[len - 1] = '\0'; strcpy(p, line); lineptr[nlines++] = p; } } return nlines; } int my_getline(char *s, int lim) { int c; char *t = s; while (--lim > 0 && (c = getchar()) != EOF && c != '\n') *s++ = c; if (c == '\n') *s++ = c; *s = '\0'; return s - t; } char *alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; }
入出力結果(Terminal)
$ cat sample.c | ./a.out 1行目、68行: } 2行目、69行: 3行目、70行: char *alloc(int n) 4行目、71行: { 5行目、72行: if (allocbuf + ALLOCSIZE - allocp >= n) { 6行目、73行: allocp += n; 7行目、74行: return allocp - n; 8行目、75行: } else 9行目、76行: return 0; 10行目、77行: } $ cat sample.c | ./a.out -5 1行目、73行: allocp += n; 2行目、74行: return allocp - n; 3行目、75行: } else 4行目、76行: return 0; 5行目、77行: } $ cat sample.c | ./a.out -15 1行目、63行: *s++ = c; 2行目、64行: if (c == '\n') 3行目、65行: *s++ = c; 4行目、66行: *s = '\0'; 5行目、67行: return s - t; 6行目、68行: } 7行目、69行: 8行目、70行: char *alloc(int n) 9行目、71行: { 10行目、72行: if (allocbuf + ALLOCSIZE - allocp >= n) { 11行目、73行: allocp += n; 12行目、74行: return allocp - n; 13行目、75行: } else 14行目、76行: return 0; 15行目、77行: } $ cat sample.c | ./a.out -100 1行目、 1行: #include <stdio.h> 2行目、 2行: #include <stdlib.h> 3行目、 3行: #include <string.h> 4行目、 4行: 5行目、 5行: #define MAXLINES 5000 6行目、 6行: #define MAXLEN 1000 7行目、 7行: #define MAXSTOR 5000 8行目、 8行: #define ALLOCSIZE 10000 9行目、 9行: 10行目、10行: void tail(int argc, char *argv[]); 11行目、11行: int readlines(char *lineptr[], int nlines); 12行目、12行: int my_getline(char *, int); 13行目、13行: char *alloc(int); 14行目、14行: char allocbuf[ALLOCSIZE]; 15行目、15行: char *allocp = allocbuf; 16行目、16行: 17行目、17行: int main(int argc, char *argv[]) 18行目、18行: { 19行目、19行: tail(argc, argv); 20行目、20行: return 0; 21行目、21行: } 22行目、22行: 23行目、23行: void tail(int argc, char *argv[]) 24行目、24行: { 25行目、25行: int n, nlines, i; 26行目、26行: char *lineptr[MAXLINES]; 27行目、27行: if (argc == 1 || (*++argv)[0] != '-') { 28行目、28行: n = 10; 29行目、29行: } else 30行目、30行: n = atoi(&(*argv)[1]); 31行目、31行: if ((nlines = readlines(lineptr, MAXLINES)) >= 0) { 32行目、32行: if (n > nlines) 33行目、33行: n = nlines; 34行目、34行: for (i = nlines - n; i < nlines; i++) 35行目、35行: printf("%2d行目、%2d行: %s\n", (n + 1) - (nlines - i), i + 1, lineptr[i]); 36行目、36行: } else 37行目、37行: printf("error: input too big\n"); 38行目、38行: } 39行目、39行: 40行目、40行: int readlines(char *lineptr[], int maxlines) 41行目、41行: { 42行目、42行: int len, nlines; 43行目、43行: char *p, line[MAXLEN]; 44行目、44行: nlines = 0; 45行目、45行: while ((len = my_getline(line, MAXLEN)) > 0) { 46行目、46行: if (nlines >= maxlines || (p = alloc(len)) == NULL) 47行目、47行: return -1; 48行目、48行: else { 49行目、49行: line[len - 1] = '\0'; 50行目、50行: strcpy(p, line); 51行目、51行: lineptr[nlines++] = p; 52行目、52行: } 53行目、53行: } 54行目、54行: return nlines; 55行目、55行: } 56行目、56行: 57行目、57行: int my_getline(char *s, int lim) 58行目、58行: { 59行目、59行: int c; 60行目、60行: char *t = s; 61行目、61行: 62行目、62行: while (--lim > 0 && (c = getchar()) != EOF && c != '\n') 63行目、63行: *s++ = c; 64行目、64行: if (c == '\n') 65行目、65行: *s++ = c; 66行目、66行: *s = '\0'; 67行目、67行: return s - t; 68行目、68行: } 69行目、69行: 70行目、70行: char *alloc(int n) 71行目、71行: { 72行目、72行: if (allocbuf + ALLOCSIZE - allocp >= n) { 73行目、73行: allocp += n; 74行目、74行: return allocp - n; 75行目、75行: } else 76行目、76行: return 0; 77行目、77行: } $
0 コメント:
コメントを投稿