« 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