演習1-18 K&R プログラミング言語C

演習1-18

#include <stdio.h>

#define MAXLINE 1024 /* 入力行の最大長 */

int mygetline(char line[], int maxline);
int delete_tail_blank(int len, char line[]);

int main(int argc, char *argv[])
{
    int len, newlen;
    char line[MAXLINE];

    while ((len = mygetline(line, MAXLINE)) > 0) {
        newlen = delete_tail_blank(len, line);
        if (newlen > 1) { /* 空白行でない場合に印字する。 */
            printf("%d:%s", newlen, line);
        }
    }

    return 0;
}

/* mygetline : s に行を入れ、長さを返す */
int mygetline(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;
}


/* 行末の空白・タブを取り除く。返り値として変更後の行の長さを返す。 */
int delete_tail_blank(int len, char line[])
{
    int last;

    len = len - 1; /* 配列 line の末尾のインデクスを行の長さ len から作る */
    last = line[len]; /* 末尾の行を保存する。末尾が改行 \n の場合の対策 */

    while (len >= 0) { /* 空白・タブ・改行以外の文字が出てくるまで len をデクリメントしていく。 */
        if (line[len] == ' ' || line[len] == '\t' || line[len] == '\n')
            ;
        else
            break;
        --len;
    }

    if (last == '\n') { /* 末尾が改行 \n の場合、改行文字を回復させる */
        line[++len] = '\n';
    }

    line[++len] = '\0';

    return len;
}
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»