主要目的是联系结构体数组;
#include <stdio.h>
#include <string.h>
struct key{
char *word;
int count;
}keytab[8]={
{"auto",0},
{"define",0},
{"main",0},
{"message", 0},
{"printf",0},
{"pthread",0},
{"sizeof",0}
};
int binsearch(char * g_char, struct key keytab[], int key_num)
{
int low = 0;
int high = key_num -1;
int mid ;
int out ;
while(high >= low)
{
mid = (low+high) / 2;
out = strcmp(g_char, keytab[mid].word) ;
if(out > 0)
{
low = mid+1;
}
else if(out < 0)
{
high = mid-1;
}
else
{
return 0;
}
}
return -1;
}
int main(void)
{
int err;
char get_char[10];
int key_num=0;
#if 0
while(strcmp(keytab[key_num].word,"")!= NULL)
key_num++;
#endif
key_num = (sizeof keytab/sizeof(struct key));
printf("word is %s\n",keytab[7].word);
printf("Please input you want to find word\n");
scanf("%s",get_char);
err = binsearch(get_char, keytab,key_num);
if(err == 0)
{
printf("Find the word\n");
}
else
printf("Sorry not find your word\n");
return 0;
}
因为假设不知道结构体数组,我想用下面的代码实现算出数组的大小,可是总是报段错误。后来
用gdb进行调试,才知道。这个函数本来有7个数组元素,本来没有keytab[7]这个元素的,系统不知道
数组元素已经完成他会一直进行下去。keytab[7]={0x00,0x00};keytab[8]={0x00,0x00};当key_num>6时,
就要进行keytab[7].word 与“”进行比较了。这就存在操作0x00这个地址了。所以报段错误了。
#if 0
while(strcmp(keytab[key_num].word,"")!= NULL)
key_num++;
#endif
可以进行的改进是while(keytab[key_num++].word != NULL)
来代替上面的代码,这样是一个解决问题的办法
但是C程序设计语言书中给出了更高明的算法:key_num = ( sizeof keytab/(sizeof key));
这是个有关字符串指针赋值的问题。呵呵……就到这里吧