《C陷阱与缺陷》第48页的一个函数的疑问
有书的可以翻到该页,我就不客气了,直接说了哈:
先上代码
- C/C++ code
#include <iostream>using namespace std;#define N 10static char buffer[N];static char *bufptr = buffer;void bufwrite(char *p, int n){ while (n > 0) { int k, rem; if (bufptr == &buffer[N]) { return; //源代码是fulshbuffer();刷新缓冲区,我直接返回了 } rem = N - (bufptr - buffer); k = n > rem ? rem : n; //k的值代表可转移的字符数最大值,取值为缓冲区剩余空间(rem)和输入数据中剩余的字符数中的较小者 memcpy(bufptr, p, k); bufptr += k; p += k; //这行代码去掉感觉没影响 n -= k; }}int main(){ char cBuf[] = "abcdefghij"; bufwrite(cBuf, 12); for (int i = 0; i < N; i++) { cout<<buffer[i]; } cout<<endl; return 1;}书中说的bufwrite()的作用是:将长度无规律的输入数据送到缓冲区(即一块能容纳N个字符的内存)中去,每当这块内存被填满时,就将缓冲区的内容写出。
我的疑问在于第二个有注释的代码,我去掉之后测试了几个感觉没什么影响。我觉得可能是我思考的不够,请哪位大侠给个测试,使得我自以为无用的那行代码有用,谢谢啦!
[解决办法]
你没有理解 这个例子啊
你这样做,到头来,还是一个个cout,
这个例子的目的 是先写到 缓冲区buffer[N],然后在fulshbuffer() 集中输出。
如果是要输出的字符串是 N的K倍,那就输出 k次。
不然你可以看看你的这个例子是否可以输出 10个字符以上的字符串。
现在回到你的问题,
p += k; 这个就是更新p的已经输出的字符的下一个字符的位置,
这样while的第二次循环的时候,就从这儿位置继续开始。
你把程序直接改成return了,这段程序去掉对你没有影响,
但是你看看如果你要输出15个字符的,
用你的程序,只能输出前面的10个,就是因为while只循环一次就结束了。
[解决办法]
lz 看的英文版, 中文版,我的49页只有一个函数
void
bufwrite(char *p; inton)
{
while (--n >= 0)
{
if (bufptr == &buffer[N))
flushbuffer() ;
*bufptr++ = *p++;
}
}
而且此段主要讲解 下标的问题