| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 784 人关注过本帖
标题:求教呀。是不是分配空间的问题。
只看楼主 加入收藏
orz_mdzz
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-10-19
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:7 
求教呀。是不是分配空间的问题。
编译过了,但运行的时候出错,帮忙看一下,谢啦。还有就是,再次调用m->vexs[i]->name或者其他时,就出现乱码,有没有什么方法解决啊。
#define N 10

#define line 30
typedef struct {
    char *name;
    char *introduction;
    char *location;
}place;

typedef struct {
    place *vexs[N];
    int arcs[N][N];
}map;


void main(){
    map *m=(map*)malloc(sizeof(map));
     CreatMap(m);

}
map *CreatMap(map *m) {
         FILE *fp;
         char *buf, *p;
         int k=0,i=0,j=0;
         fp=fopen("景点.txt", "r");
         buf=(char*)malloc(line*sizeof(char));     // buf用来存放读进来的字符串
         while(1){
            p=readdata(fp, buf);//每次调用文件指针fp会自动后移一行
            if(!p)//文件读取结束则跳出循环
            break;
            Input(buf,m,k);
            k++;
         }
         free(buf);
}

char * readdata(FILE *fp, char *buf){
     return fgets(buf,line, fp);//读取一行到buf
}

void Input(char *buf,map *m,int k){
    int i,j;
    j=k%3;
    for (i=0;i < N;i++){
        m->vexs[i]=(place*)malloc(sizeof(place));
        switch(j){
            case 0:m->vexs[i]->name=(char*)malloc(line*sizeof(char));m->vexs[i]->name=buf;break;
            case 1:m->vexs[i]->introduction=(char*)malloc(line*sizeof(char));m->vexs[i]->introduction=buf;break;
            case 2:m->vexs[i]->location=(char*)malloc(line*sizeof(char));m->vexs[i]->location=buf;break;
        };
    }
}
搜索更多相关主题的帖子: 空间 
2016-12-16 08:33
orz_mdzz
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-10-19
收藏
得分:0 
自顶
2016-12-16 09:06
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
这里直接赋值是什么鬼?
m->vexs[i]->name = buf
应该用字符串拷贝吧。
因为没有 景点.txt 这个文件,也不方便调试。
2016-12-16 09:07
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
你应该提供“景点.txt”文件或相应格式的文字,否则大神们也不好帮你调试的。
2016-12-16 09:11
orz_mdzz
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-10-19
收藏
得分:0 
嗯嗯。景点.txt
钟楼
西安钟楼始建于明洪武十七年,原址在今西大街广济街口,与鼓楼对峙。昔日楼上悬一口大钟,用于报警报时,故名“钟楼”。
西安市中心
大唐芙蓉园
中国第一个全方位展示盛唐风貌的大型皇家园林式文化主题公园
西安城南的曲江开发区
城墙
中国现存规模最大、保存最完整的古代城垣
西安市中心区
大雁塔
现存最早、规模最大的唐代四方楼阁式砖塔
西安市南
兵马俑
被誉为“世界第八大奇迹”
西安市临潼区秦始皇陵以东
翠华山
原名太乙山,景区由碧山湖景区、天池景区和山崩石海景区3部分组成
西安城南20公里处秦岭北麓
碑林
收藏中国古代碑石时间最早,收藏名碑最多的汉族文化艺术宝库
西安市碑林区三学街十五号
骊山
文物胜迹众多、自然景观秀丽
秦岭山脉
回民街
西安著名的美食文化街区
钟鼓楼后
陕西历史博物馆
中国第一座大型现代化国家级博物馆
西安市雁塔区小寨东路
2016-12-16 09:13
orz_mdzz
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-10-19
收藏
得分:0 
回复 3楼 grmmylbs
字符串可以直接拷贝吗?我的是中文欸
2016-12-16 09:14
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:15 
你代码的目的是啥?
为啥要用这个循环:
for (i = 0; i < N; i++) {
        m->vexs[i] = (place*)malloc(sizeof(place));//每次读一行都要申请一遍内存
        switch (j) {
        case 0:m->vexs[i]->name = (char*)malloc(line*sizeof(char)); strcpy(m->vexs[i]->name, buf); break;
        case 1:m->vexs[i]->introduction = (char*)malloc(line*sizeof(char)); strcpy(m->vexs[i]->introduction, buf); break;
        case 2:m->vexs[i]->location = (char*)malloc(line*sizeof(char)); strcpy(m->vexs[i]->location, buf); break;
        };
    }
2016-12-16 09:24
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:5 
空间分配太少,汉字一个需要两个字节,吧#define line 30改为#define line 200
2016-12-16 10:05
快速回复:求教呀。是不是分配空间的问题。
数据加载中...
 
   



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

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