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