行数を数える #3
改行とは'\r'と'\n'の連接であるかさもなければ'\r'か'\n'であるとする。
この定義で行数を数えるように変更する。
行数を数えるときは'\r'に続いて'\n'が現れたときに一個の改行となると考えるよりも、
'\r'が現れた段階で行数をカウントアップし、
'\n'でカウントアップする条件は直前の文字が'\r'でないこととした方がスムースになる。
#include <stdio.h> typedef enum { FALSE = 0 } bool_t; int main(void) { unsigned long nlines = 0L; bool_t succeeded_eol = FALSE, succeeded_cr = FALSE; int c = getchar(); if (c != EOF) { do { if (c == '\r') { ++nlines; succeeded_eol = succeeded_cr = ! FALSE; } else { succeeded_eol = c == '\n'; if (succeeded_eol && ! succeeded_cr) ++nlines; succeeded_cr = FALSE; } } while ((c = getchar()) != EOF); if (! succeeded_eol) ++nlines; } printf("%lu\n", nlines); return 0; }