2013年8月16日金曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第5章(ポインタと配列)、5.10(コマンド行の引数)、演習5-13を解いてみる。

その他参考書籍

演習 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 コメント:

コメントを投稿