開発環境
- 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 コメント:
コメントを投稿