【程序功能】
模拟字符串进入缓存的操作。
c_replace函数的形参str指向用作缓存的二维数组,temp指向准备进入缓存的字符串,cache指向一个指针数组,该指针数组的NUM个元素按进入缓存的字符串先后顺序指向缓存中的NUM个字符串(例如,cathe[0]指向缓存中最早进入的字符串)。
c_replace函数功能:若temp字符串已存在于str缓存中(命中),则函数返回1。若不命中,则当str缓存未满时,直接将temp字符串追加复制到str缓存中,将缓存中新存入的字符串地址保存到cache数组中,函数返回0;当str缓存已满时,则用temp字符串替换最早进入str缓存的字符串,并调整cache数组中的顺序,函数返回0。
主函数调用c_replace函数并依次向c_replace函数传递10个字符串的地址、缓存(str数组)起始地址及指针数组起始地址,按照指针数组元素的顺序依次输出所指向的最后留在缓存中的字符串,并输出命中率。
【测试数据及运行结果】
输入:
"a ","b ","abc","a ","d ","e ","a ","f ","a ","b "
上面双引号之间都是三个字母,比如a就是三个a
输出:
d e f a b
这也是三个相同字母
hit=0.200000
【含有错误的源程序】
#include<stdio.h>
#include<string.h>
#define NUM 5
int c_replace(char *cache,char str[][80],char *temp)
{
int i;
char *t;
for(i=0;i<NUM&&cache[i]!=NULL;i++)
if(cache[i]==temp) return 1;
if(i<NUM&&cache[i]==NULL) {
strcpy(str[i],temp);
cache[i]=str[i];
}
else{
t=cache[0];
for(i=NUM-2;i>=0;i--)
cache[i]=cache[i+1];
cache[NUM-1]=t;
strcpy(cache[NUM-1],temp);
}
return 0;
}
int main(void)
{
char * cache[NUM]={0},str[NUM][80];
char input[80];
int i,count=0;
float hit;
for(i=0;i<10;i++){
gets(input);
count+=c_replace(cache,str,input);
}
hit=count/10;
for(i=0;i<NUM;i++)
printf("%s ",cache[i]);
printf("hit=%f\n",hit);
return;
}
#include<stdio.h>
#include<string.h>
#define NUM 5
int c_replace(char** cache, char str[][80], char* temp)//char* cache
{
int i;
char* t;
for (i = 0; i < NUM && cache[i] != NULL; i++)
if (strcmp(cache[i],temp)==0) return 1;//cache[i] == temp
if (i < NUM && cache[i] == NULL) {
strcpy(str[i], temp);
cache[i] = str[i];
}
else {
t = cache[0];
for (i = 0; i <NUM-1; i++)//i=NUM-2;i>=0;i--
cache[i] = cache[i + 1];
cache[NUM - 1] = t;
strcpy(cache[NUM - 1], temp);
}
return 0;
}
int main(void)
{
char* cache[NUM] = { 0 }, str[NUM][80];
char input[80];
int i, count = 0;
float hit;
for (i = 0; i < 10; i++) {
gets(input);
count += c_replace(cache, str, input);
}
hit = count / 10.0;// hit = count / 10
for (i = 0; i < NUM; i++)
printf("%s ", cache[i]);
printf("hit=%f\n", hit);
return 0;
}