返回信息流代码如下:代码很简单(举了个很小的3*3的小页面作为示例),基本上就是直接照书抄的,也可以参见P55页
作者的优化意图是为了使缓冲区少一行,节省空间,可以看截图1
描述要求里面有,生成一个数字调用一次print,生成数字结束后,调用flush刷新,最后,还要求已打印的行不能修改=。=
我的测试输入为01234567八个数,生成输出如下:
0 3 6
1 4 7
0 3
1 4
2 5
最后,这本书序言中说印了N多次,没有修改过=。=当然,我说的这个错误,算是算法的错误吧。。。knuth说过,过早的优化是万恶之源
#define NROWS 3
#define NCOLS 3
#define BUFSIZE (NROWS*(NCOLS-1))
static int buffer[BUFSIZE];
static int * bufptr = buffer;
void printnum(int);
void printnl();
void printpage();
void flush();
void print(int);
int main()
{
int i;
for(i=0;i<8;i++)
print(i);
flush();
return 0;
}
void print(int n)
{
if(bufptr == &buffer[BUFSIZE])
{
static int row =0;
int *p;
for(p=buffer+row;p<bufptr;p+=NROWS)
printnum(*p);
printnum(n);
printnl();
if(++row==NROWS)
{
printpage();
row=0;
bufptr=buffer;
}
}else
*bufptr++=n;
}
void flush()
{
int row;
int k=bufptr-buffer;
if(k>NROWS)
k=NROWS;
if(k>0)
{
for(row=0;row<k;row++)
{
int *p;
for(p=buffer+row;p<bufptr;p+=NROWS)
printnum(*p);
printnl();
}
printpage();
}
}
void printnum(int n)
{
printf(" %d ",n);
}
void printnl()
{
putchar('\n');
}
void printpage()
{
//字符N表示新一页
putchar('\n');
putchar('N');
putchar('\n');
}
代码结束。。。额
这是一条镜像帖。来源:北邮人论坛 / cpp / #42362同步于 2010/8/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
我是发现了C缺陷与陷阱一书中的错误么?=。=
times123
2010/8/12镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复