C语言之简单英语词典实现

要求:从文件中查找对应英文单词并给出中文解释,文件中的单词和中文解释需用'\t'(键盘Tab键)隔开,每行一个单词加解释。

代码:

#include     
int find_dic(char (*list)[20], int high, char* str);       /*< 定义两个数组分别存放单词和解释 */
int main(void)
{
    char word[8000][20], app[8000][20];  
    int num, m, sum = 0;
    char str[20];
    FILE *fp;
    fp = fopen("C:\\Users\\Administator\\Desktop\\dictionary.txt", "r");   /*< 打开词典,只读模式 */
    if(fp == NULL)
    {
        printf("open file failed...");
        return 0;
    }
    while(!feof(fp))
    {
        fscanf(fp, "%s%s", word[sum], app[sum]);                   /*< 将文件中的内容读出并保存 */
        sum++;
    }
    fclose(fp);                                                   /*< 用完必须关闭文件,不然可能会造成内存泄漏或文件崩溃 */    
    while(1)
    {
        printf("请输入单词,(0000)结束:");
        scanf("%s", str);

        if(strcmp(str, "0000") == 0)
        {
            printf("谢谢使用!");
            return 0;
        }
        num = find_dic(&word[0], sum - 1, str);
        if(num == -1)
            printf("查无此词...\n");
        else
            printf("%s的解释为:%s\n", word[num], app[num]);
    }
    return 0;
}
/******
**@fun:二分法查找
**@par:数组指针,单词个数,要查找的字符串指针
**@ret:返回-1表示词典里无此单词,其他值表示查到字典对应位置 
******/ 
int find_dic(char (*list)[20], int high, char* str)
{
    int mid, low = 0;
    int n;
    while(low <= high)
    {
        mid = (low + high) / 2;            
        if(strcmp(list[mid], str) == 0)        
            return mid;
        else if(strcmp(list[mid], str) > 0)
            high -= 1;
        else
            low += 1;
    }
    return -1;
}

附加:关于find_dic函数中第一个参数类型的说明:

在此函数中是对二维数组进行字符串的查找而不是字符。所以应传入数组指针(char (*list)[20])而不是(char *list)或者

(char *list[20])后者是指针数组,表示list指向的内容是char类型的指针。在选择实参时有word, &word[0], &word, word[0],

&word[0][0]5种指针,前面两种是char (*)[20]类型,中间一个是char (*)[8000][20]类型,而最后两个是char *类型,虽然这5种

指针的值是一样的

分别打印一下word, word + 1, &word[0] + 1, &word + 1, word[0] + 1, &word[0][0] + 1,得到如下结果:

C语言之简单英语词典实现_第1张图片

word表示二维数组首地址,word+1与&word[0] + 1相对首地址偏移了20个字节, &word + 1相对于首地址偏移了200*8000个字节,word[0] + 1与&word[0][0] + 1偏移了1个字节,可以看出word+1与&word[0] + 1以一个一维数组为单位偏移量(即我们需要的数组指针),&word + 1整个二维数组为偏移量,word[0] + 1与&word[0][0] + 1以一个字符为偏移量。

总结:

引用一维数组结论:数组名做指针表示首个元素地址,对数组名取地址表示整个数组首地址。

二维数组其实就是数组的数组,如a[3][3] = {a[0], a[1], a[2]};而b[0] = {a[0][0], a[0][1], a[0][2]};...a表示数组首个元素地址时,a+1就表示a[1]而不是a[0][1],符合单位偏移一个数组,&a[0]就表示a[0]整个数组不是a[0]的第一个元素的首地址,所以&a+1就表示下个数组a[1]首地址,也符合单位偏移一个数组。

所以最好把二维数组看成是数组的数组而不是二维数组。

你可能感兴趣的:(C语言之简单英语词典实现)