2011-11-13
只需记住 a[i] 相当于 *(a+i)
考虑不对称边界偏好 让指针指向第一个未背占用的字符
*bufptr++ = c;
//缓冲区申明
define N 1024
static char buffer[N];
static char *bufptr = buffer;//p指向将要写入缓存区的第1个字符 //n 代表将要写入缓存区的字符数 //flushbuffer 把缓存区的内容写出,且会重置bufptr指针 void bufwrite(char *p, int n) { while (--n >= 0){ //--n >= 0 等效于 n-- > 0 if (bufptr == &buffer[N]) //条件等效于 bufptr > &buffer[N-1] 因为坚持“不对称边界”原则 flushbuffer(); *bufptr++ = *p++; } }
//库函数,一次移动k个字符,通常用汇编语言实现来提高速度。下面是自己实现这个函数
void memcpy(char *dest, const char *source, int k) { while( --k >= 0) *dest++ = *source++; }
//bufwrite memcpy 版
void bufwrite(char *p, int n) { while(n > 0){ int k, rem;
if (bufptr == &buffer[N]) flushbuffer();
记住两个原则,特例外推法和仔细计算边界!rem = N - (bufptr - buffer); //缓存区当前可用字符数,总字符-以占用字符。 k = n > rem? rem: n; memcpy(bufptr, p, k); bufptr += k; p += k; n -= k; } }
//代码皆出自《c陷进与缺陷》