您的位置:首页 > 其它

一个有关计算结构体数组大小的问题

2011-12-13 10:40 211 查看
这个程序的做的事情,输入一个字符串,然后用折半查找法查找这个字符串是否在已存在的程序中。
主要目的是联系结构体数组;

#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));

这是个有关字符串指针赋值的问题。呵呵……就到这里吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐