開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: C
- Clang (コンパイラ)
プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第7章(入出力)、7.7(行の入出力)、演習7-7を解いてみる。
その他参考書籍
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
演習 7-7.
コード
sample.c
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int my_getline(char *, int);
int main(int argc, char *argv[])
{
char line[MAXLINE];
long lineno = 0;
int c, except = 0, number = 0, found = 0;
FILE *fp;
char pattern[MAXLINE];
while (--argc > 0 && (*++argv)[0] == '-')
while (c = *++argv[0])
switch (c) {
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c\n", c);
argc = 0;
found = -1;
break;
}
if (argc == 2) {
strcpy(pattern, *argv);
if((fp = fopen(*++argv, "r")) == NULL) {
fprintf(stderr, "%s: can't open %s\n", argv[0], *argv);
exit(1);
} else {
while (fgets(line, MAXLINE, fp) != NULL) {
lineno++;
if ((strstr(line, pattern) != NULL) != except) {
if (number)
printf("%ld:", lineno);
printf("%s", line);
found++;
}
}
fclose(fp);
}
} else if (argc == 1)
while (my_getline(line, MAXLINE) > 0) {
lineno++;
if ((strstr(line, *argv) != NULL) != except) {
if (number)
printf("%ld:", lineno);
printf("%s", line);
found++;
}
}
else
fprintf(stderr, "Usage: find -x -n pattern [filename]\n");
return found;
}
int my_getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
入出力結果(Terminal)
$ ./a.out MAXLINE < sample.c
#define MAXLINE 1000
char line[MAXLINE];
char pattern[MAXLINE];
while (fgets(line, MAXLINE, fp) != NULL) {
while (my_getline(line, MAXLINE) > 0) {
$ ./a.out MAXLINE sample.c
#define MAXLINE 1000
char line[MAXLINE];
char pattern[MAXLINE];
while (fgets(line, MAXLINE, fp) != NULL) {
while (my_getline(line, MAXLINE) > 0) {
$ ./a.out -n MAXLINE < sample.c
3:#define MAXLINE 1000
9: char line[MAXLINE];
13: char pattern[MAXLINE];
36: while (fgets(line, MAXLINE, fp) != NULL) {
48: while (my_getline(line, MAXLINE) > 0) {
$ ./a.out -n MAXLINE sample.c
3:#define MAXLINE 1000
9: char line[MAXLINE];
13: char pattern[MAXLINE];
36: while (fgets(line, MAXLINE, fp) != NULL) {
48: while (my_getline(line, MAXLINE) > 0) {
$ ./a.out -nx MAXLINE sample.c
1:#include <stdio.h>
2:#include <string.h>
4:
5:int my_getline(char *, int);
6:
7:int main(int argc, char *argv[])
8:{
10: long lineno = 0;
11: int c, except = 0, number = 0, found = 0;
12: FILE *fp;
14:
15: while (--argc > 0 && (*++argv)[0] == '-')
16: while (c = *++argv[0])
17: switch (c) {
18: case 'x':
19: except = 1;
20: break;
21: case 'n':
22: number = 1;
23: break;
24: default:
25: printf("find: illegal option %c\n", c);
26: argc = 0;
27: found = -1;
28: break;
29: }
30: if (argc == 2) {
31: strcpy(pattern, *argv);
32: if((fp = fopen(*++argv, "r")) == NULL) {
33: fprintf(stderr, "%s: can't open %s\n", argv[0], *argv);
34: exit(1);
35: } else {
37: lineno++;
38: if ((strstr(line, pattern) != NULL) != except) {
39: if (number)
40: printf("%ld:", lineno);
41: printf("%s", line);
42: found++;
43: }
44: }
45: fclose(fp);
46: }
47: } else if (argc == 1)
49: lineno++;
50: if ((strstr(line, *argv) != NULL) != except) {
51: if (number)
52: printf("%ld:", lineno);
53: printf("%s", line);
54: found++;
55: }
56: }
57: else
58: fprintf(stderr, "Usage: find -x -n pattern [filename]\n");
59: return found;
60:}
61:
62:int my_getline(char s[], int lim)
63:{
64: int c, i;
65:
66: for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
67: s[i] = c;
68: if (c == '\n') {
69: s[i] = c;
70: ++i;
71: }
72: s[i] = '\0';
73: return i;
74:}
$ ./a.out
Usage: find -x -n pattern [filename]
$ ./a.out -a
find: illegal option a
Usage: find -x -n pattern [filename]
$
0 コメント:
コメントを投稿