定义数组int a[10] 数组下标为0~9,不包含下标10。
//设置数组a中所有元素为0
int a[10],i;
for(i=0;i<10;i++){
a[i]=0;
}
编写函数bufwrite,该函数的功能是将长度无规律的输入数据送到缓冲区,送到一块能够容纳N个字符的内存中,每当这块内存被填满时,就将缓冲区的内容写出
#define N 1024
static char buffer[N];
static char *bufptr;
void bufwrite(char *p,int n){
while(--n>=0){
if(bufptr==&buffer[N])
flushbuffer();
*bufptr++=*p++;
}
}
若一次移动k个字符:
//库函数
void memcpy(char* dest,const char *source,int k){
while(--k>=0)
*dest++=*source++;
}
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;
}
}
函数包含两个参数,第一个参数是一个指针,指向将要写入缓冲区的第一个字符,第二个参数是一个整数,代表将要写入缓冲区的字符数。假定函数flushbuffer()可以将缓冲区中内容写出,并重置指针bufptr,使其指向缓冲区的起始位置。
bufptr==&buffer[N]
比较指针bufptr和缓冲区后第一个字符的地址,当对于下标越界的数组元素取地址也是非法时,课采用下面的公式,二者等效
bufptr>&buffer[N-1]
memcpy函数可以一次将一批字符转移到缓冲区
因此第14-19行即可实现保证缓冲区不溢出的情况下,一次转移尽可能多的字符到缓冲区
- 从缓冲区第一个未占用字符开始,复制k个字符到缓冲区
- 将指针bufptr指向的地址前移k个字符,使其仍指向缓冲区中第一个未占用的字符
- 输入字符串的指针p前移k个字符
- 将n,即待转移字符数减去k
如何确定每次转移的字符数k
- 输入数据中剩余待转移字符数
- 缓冲区中未占用字符数
k取两者中较小的一个
rem=N-(bufptr-buffer)
k=n>rem?rem:n
缓冲区未占用字符数rem两种计算方法
- 缓冲区最大容量N减去缓冲区中已占用的字符数,N-(bufptr-buffer)
- 缓冲区最后一个位置的地址减去当前第一个未占用字符的地址,即(buffer+N)-bufptr
两种方法所得公式完全等价
若对于下标越界的数组元素取其地址是非法的
void bufwrite(char *p,int n){
while(--n>=0){
if(bufptr==&buffer[N-1]){
*bufptr=*p;
flushbuffer();
}else
*bufptr=*p++;
if(n>0)
p++;
}
}
void bufwrite(char *p,int n){
while(n>0){
int k,rem;
rem=N-(bufptr-buffer);
k=n>rem?rem:n;
memcpy(bufptr,p,k);
if(k==rem)
flushbuffer();
else
bugptr+=k;
n-=k;
if(n)
p+=k;
}
}
8万+

被折叠的 条评论
为什么被折叠?



