| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 484 人关注过本帖
标题:奇怪的现象,求解释
只看楼主 加入收藏
tujing_128
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-11-2
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:4 
奇怪的现象,求解释
程序代码:
[local]2[/local]程序就是读取数据库、检索。请先看注释吧。
我的其他文件在附件中,包括数据库文件,请用我用的文件(a.txt)进行测试。


#include <stdio.h>
#include "strlib.h"
#include "strlib.cpp"
#include "file.h"
#include "file.cpp"
#include "scanner.h"
#include "scanner.cpp"
#include "genlib.h"
#include "genlib.cpp"




#define N 1000

//---------------------------------
typedef char *string;

typedef struct {
    string name;
    string writers;
    string number;
    string mainwords;
    string publisher;
    string year;
    bool lend;
}*bookT;

typedef struct {
    bookT book[N+1];
}*bookDB;

//--------------------------------
static void ReadDate(FILE *infile,bookDB books);
static void CheckBook(bookDB books);
static void SearchBook(string mainword,bookDB books);
static void PrintBook(bookT book);





main()
{
    FILE *infile;
    bookDB books;
   
    printf("本程序将读入图书馆书库的数据库,并提供检索功能。\n");
    infile=OpenFile("请输入图书馆数据库的文件名?");

    books=(bookDB)malloc(sizeof(*books)*1);       
    ReadDate(infile,books);
   
    fclose(infile);
    CheckBook(books);
}
static void ReadDate(FILE *infile,bookDB books)
{
    string name;
    string writers;
    string number;
    string mainwords;
    string publisher;
    string year,tmp;
    int n=0;


    while(true){
        books->book[n]=(bookT)malloc(sizeof(*(books->book[n])));
           
        name=ReadLine(infile);
        books->book[n]->name=name;
        writers=ReadLine(infile);
        books->book[n]->writers=writers;
        number=ReadLine(infile);
        books->book[n]->number=number;
        mainwords=ReadLine(infile);
        books->book[n]->mainwords=mainwords;
        publisher=ReadLine(infile);
        books->book[n]->publisher=publisher;
        year=ReadLine(infile);
        books->book[n]->year=year;
        tmp=ReadLine(infile);
        if (StringEqual(tmp,"")) {
            books->book[n]->lend=true;
        }else {
            books->book[n]->lend=false;       
        }
        n++;
        tmp=ReadLine(infile);
        if (tmp==NULL) break;
        if (n==N) {
            printf("书籍过多,无法完全读取。\n");
            break;
        }       
    }       
    books->book[n]=NULL;
}
        

static void CheckBook(bookDB books)
{
    string mainword;
    printf("本程序将根据您所输入的关键词进行检索。\n");
    printf("如果书中包含您所输入的关键词,那么书目的书名、第一作者姓名以及目录号码会显示出来。\n");
    printf("请输出关键词:");
    mainword=GetLine();
   
    SearchBook(mainword,books);
}

static void SearchBook(string mainword,bookDB books)
{
    int n=0;
    string tmp;
   
    while (books->book[n]!=NULL){
        InitScanner(books->book[n]->mainwords);
   
        while(!StringEqual(tmp=GetNextToken(),"\0")){
       
            if (StringEqual(mainword,tmp)) break;
        }
               
        if (StringEqual(tmp,"\0")){
            n++;
            continue;
        }else{
        PrintBook(books->book[n]);
        n++;
        }
    }
}
static void PrintBook(bookT book)
{
   
    printf("书名:%s\n",book->name);
    InitScanner(book->writers);


    printf("第一作者:%s\n",GetNextToken());
    printf("书号:%s\n\n",book->number);
}



这是scanner.cpp的代码

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "scanner.h"

static char *hang;
static int jihao;
static int chang;

void InitScanner(char *line)
{
    hang=line;//三个参数的初始化
    chang=strlen(hang);
    jihao=0;
}

char *GetNextToken()
{
    char dang;
    int kaishi;
    dang=hang[jihao];
    if (isalnum(dang)){
        kaishi=jihao;
        while ( isalnum(hang[jihao])){
            jihao++;
        }
        return (SubString(hang,kaishi,jihao-1));
    }else if (dang<0 || dang>128){                                      //汉字的编码在文件中是128以上,在机器中是负值,以此寻找汉字
        kaishi=jihao;       
        while ( hang[jihao]<0 ||hang[jihao]>128) ){
            jihao++;
        }
   //   printf("%s\n",SubString(hang,kaishi,jihao-1);             //代码单独测试没有问题,但是在这个程序里,注释printf输出乱码,保留输出正确  
        return (SubString(hang,kaishi,jihao-1));                                   
    }else{
        jihao++;
        return (CharToString(dang));
    }
}



static char *SubString(char a[],int p1,int p2)
{

    int i;
    char *s;
    if (p1<0) p1=0;
    if (p2>strlen(a)-1) p2=strlen(a)-1;
    if (p2<p1) {
        s=(char*)malloc(1);
        *s='\0';
        return (s);
    }

    s=(char*)malloc(sizeof(char)*(p2-p1+2));
    for(i=p1;i<=p2;i++){
        s[i-p1]=a[i];
    }
    s[i-p1]='\0';
    return (s);
}



static char *CharToString(char a)
{
    char *s;
    s=(char*)malloc(sizeof(char)*2);
    s[0]=a;
    s[1]='\0';
    return (s);
}
   
   


新建文件夹.rar (6.22 KB)
搜索更多相关主题的帖子: 数据库 color 
2011-02-25 22:30
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:4 
有难度!

   唯实惟新 至诚致志
2011-02-26 07:59
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
收藏
得分:4 
难。不懂了
2011-02-26 08:53
ghc1268
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2011-2-26
收藏
得分:4 
不小的考验,承认本人水平有待提高,也对高人解决拭目以待!
2011-02-26 10:57
xchong
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2011-2-26
收藏
得分:4 
好帖
2011-02-26 12:24
快速回复:奇怪的现象,求解释
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023225 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved