首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

《C陷阱与缺陷》第48页的一个函数的疑问解决方法

2012-03-19 
《C陷阱与缺陷》第48页的一个函数的疑问有书的可以翻到该页,我就不客气了,直接说了哈:先上代码C/C++ code#in

《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++;
}
}

而且此段主要讲解 下标的问题

热点排行