« Captcha Plugin/ja について | メイン | brainf*ck で計算機 »

2006年06月26日

C で tail に queue は不要

 なんか C で tail を書くのが流行っているらしいので参戦します。

 はこべさん弾さんの例だと、動的なデータ構造を使っているが、これは牛刀だと思いました。少なくとも、djb 先生のお好きな回答でないことは確かです (^^;

 C で書くとしたら、やはり目的に特化したデータ構造を使うことで、速度と可読性を稼ぐべきではないでしょうか。

 ということで、奥の回答。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STR 256
#define LINES 10

int main(int argc, char **argv)
{
  char buf[LINES][MAX_STR + 1];
  int slot, i;

  memset(buf, 0, sizeof(buf));
  slot = 0;

  while (fgets(buf[slot], MAX_STR, stdin))
    slot = (slot + 1) % LINES;

  for (i = 0; i < LINES; i++)
    fputs(buf[(slot + i) % LINES], stdout);

  return 0;
}
(15:11 修正版)



↓がエントリ掲載時のものです。fgets は EOF の際非破壊(たぶん)なので、 LINES + 1 列の配列は不要でした。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STR 256
#define LINES 10

int main(int argc, char **argv)
{
  char buf[LINES + 1][MAX_STR + 1];
  int slot, i;

  memset(buf, 0, sizeof(buf));
  slot = 0;

  while (fgets(buf[slot], MAX_STR, stdin)) {
    slot = (slot + 1) % (LINES + 1);
    buf[slot][0] = '\0';
  }

  for (i = (slot + 1) % (LINES + 1); i != slot; i = (i + 1) % (LINES + 1))
    fputs(buf[i], stdout);

  return 0;
}
14:09 追記: fputs の直前に余計な条件判断が入っていたのを削除しました

投稿者 kazuho : 2006年06月26日 13:42 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/663

このリストは、次のエントリーを参照しています: C で tail に queue は不要:

» C - ring buffer による queue from 404 Blog Not Found
同感。 Kazuho@Cybozu Labs: C で tail に queue は不要 C で書くとしたら、やはり目的に特化したデータ構造を使うことで... [続きを読む]

トラックバック時刻: 2006年06月26日 15:35