求助:向结构体输入数据是乱码了

编程萝卜 2013-12-20 05:15:15
发现就是这个语句的问题,第四个SCORE还是正确的,第五个就错误了
      scanf("%d%s%d%d%d%d",&(p->num),(p->name),&(p->score[0]),&(p->score[1]),&(p->score[2]),&(p->score[3]),&(p->score[4]),&(p->score[5]));

struct achieve{
int num;
char name[20];
long score[6];
struct achieve *next;
}tab_achieve ;//学生信息结构体
...全文
235 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
大奶兔白糖 2013-12-21
  • 打赏
  • 举报
回复
引用 9 楼 u012851419 的回复:
[quote=引用 8 楼 bijiaoben 的回复:] 而且同时满足(strcmp(p0->name,p->name))>0和(p0->next!=NULL)的话,p还是会被插到尾部,违背了楼主的按名字从大到小排序的本意。 还有一个需要注意的就是楼主最好检查一下每次fread的返回值。楼主这个现象很明显就是多读了一次文件,但是没有读取出成功,导致结构体中都是随机值。应该和文件结束符的检测影响了楼主的读取操作有关。
来了前辈来了前辈,那个,要文件里面的东西么 这 gdgdag D? D? 偛寁 gddg g D? D? 偛寁 gdag g D? D? 偛寁 gadggga D? D? 偛寁[/quote] 兄弟,你文件里面的这几个名字和你的排序结果对不上啊。。。怎么输出的名字里面有个h开头的啊?
编程萝卜 2013-12-20
  • 打赏
  • 举报
回复
引用 8 楼 bijiaoben 的回复:
而且同时满足(strcmp(p0->name,p->name))>0和(p0->next!=NULL)的话,p还是会被插到尾部,违背了楼主的按名字从大到小排序的本意。 还有一个需要注意的就是楼主最好检查一下每次fread的返回值。楼主这个现象很明显就是多读了一次文件,但是没有读取出成功,导致结构体中都是随机值。应该和文件结束符的检测影响了楼主的读取操作有关。
来了前辈来了前辈,那个,要文件里面的东西么 这 gdgdag D? D? 偛寁 gddg g D? D? 偛寁 gdag g D? D? 偛寁 gadggga D? D? 偛寁
大奶兔白糖 2013-12-20
  • 打赏
  • 举报
回复
而且同时满足(strcmp(p0->name,p->name))>0和(p0->next!=NULL)的话,p还是会被插到尾部,违背了楼主的按名字从大到小排序的本意。 还有一个需要注意的就是楼主最好检查一下每次fread的返回值。楼主这个现象很明显就是多读了一次文件,但是没有读取出成功,导致结构体中都是随机值。应该和文件结束符的检测影响了楼主的读取操作有关。
大奶兔白糖 2013-12-20
  • 打赏
  • 举报
回复
楼主能不能提供一下你的测试用例啊?这段代码看着很怪,感觉不太对啊,p永远都是插在p0的后面: else {while((strcmp(p0->name,p->name))>0&&(p0->next!=NULL)){ p0=p0->next; } if(p0->next!=NULL){ p->next=p0->next; p0->next=p;} else { p0->next=p; p->next=NULL; }
大奶兔白糖 2013-12-20
  • 打赏
  • 举报
回复

void f8(FILE * pf){//这个是排序函数
       struct achieve *top,*p,*p0;
       fseek(pf,0,SEEK_END);
       if((ftell(pf)/sizeof(struct achieve))>1){
          p=(struct achieve *)malloc(sizeof(struct achieve));
          rewind(pf);
          fread(p,sizeof(struct achieve),1,pf);
          top=p;
          top->next=NULL;
          while(!feof(pf)){
           p0=top;
           p=(struct achieve *)malloc(sizeof(struct achieve));
           fread(p,sizeof(struct achieve),1,pf);
           if((strcmp(top->name,p->name))<=0){
             p->next=top;
             top=p;
           }
           else{
              while((strcmp(p0->name,p->name))>0&&(p0->next!=NULL)){
                p0=p0->next;
              }
             if(p0->next!=NULL){
                p->next=p0->next;
                p0->next=p;
             }
             else{
              p0->next=p;
              p->next=NULL;
             }
         }
       }
        list(top);
    }
    else{
       if((ftell(pf)/sizeof(struct achieve))==1){
         p=(struct achieve *)malloc(sizeof(struct achieve));
         fread(p,sizeof(struct achieve),1,pf);
         p->next=NULL;
         list(p);
       }   //此处写上输出函数}
       else 
         printf("文件里没有任何信息\n");
    }
}
先帮楼主把程序排一下
编程萝卜 2013-12-20
  • 打赏
  • 举报
回复
引用 4 楼 Meteor_Code 的回复:
fwrite(p,sizeof(struct achieve),1,pf);
这很正常啊
gdg是你那个name
gdg后面的那个空1格是结尾0
烫烫烫烫烫烫烫烫,是后面16个无效字节数据
? 4 ? ? 烫烫烫烫 这个就是你那6个score 按你原来的写法 烫烫烫烫 正好是你scanf没赋值的score[4] score[5]
烫烫 无效的next指针
烫 好像是0xcd0xcd 还是 0xcc0xcc 来着,应该是一条汇编指令int3

大神那些都解决了,但是我文件里明明是三个结构体,但是一排序出来就出现这个
void f8(FILE * pf){//这个是排序函数
struct achieve *top,*p,*p0;
fseek(pf,0,SEEK_END);
if((ftell(pf)/sizeof(struct achieve))>1){
p=(struct achieve *)malloc(sizeof(struct achieve));
rewind(pf);
fread(p,sizeof(struct achieve),1,pf);
top=p;
top->next=NULL;
while(!feof(pf)){
p0=top;
p=(struct achieve *)malloc(sizeof(struct achieve));
fread(p,sizeof(struct achieve),1,pf);
if((strcmp(top->name,p->name))<=0){
p->next=top;
top=p;
}
else {while((strcmp(p0->name,p->name))>0&&(p0->next!=NULL)){
p0=p0->next;
}
if(p0->next!=NULL){
p->next=p0->next;
p0->next=p;}
else {
p0->next=p;
p->next=NULL;
}
}
}
list(top);
}
else{
if((ftell(pf)/sizeof(struct achieve))==1){
p=(struct achieve *)malloc(sizeof(struct achieve));
fread(p,sizeof(struct achieve),1,pf);
p->next=NULL;
list(p);} //此处写上输出函数}
else printf("文件里没有任何信息\n");
}}

void list (struct achieve *p){//这个是输出函数
while(p!=NULL){
printf("学号为%d 姓名为%s 成绩分别为%d %d %d %d %d %d\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5]);
p=p->next;
}
}
Meteor_Code 2013-12-20
  • 打赏
  • 举报
回复
fwrite(p,sizeof(struct achieve),1,pf); 这很正常啊 gdg是你那个name gdg后面的那个空1格是结尾0 烫烫烫烫烫烫烫烫,是后面16个无效字节数据 ? 4 ? ? 烫烫烫烫 这个就是你那6个score 按你原来的写法 烫烫烫烫 正好是你scanf没赋值的score[4] score[5] 烫烫 无效的next指针 烫 好像是0xcd0xcd 还是 0xcc0xcc 来着,应该是一条汇编指令int3
编程萝卜 2013-12-20
  • 打赏
  • 举报
回复
引用 1 楼 Meteor_Code 的回复:
scanf("%d%s%d%d%d%d%d%d",&(p->num),(p->name),&(p->score[0]),&(p->score[1]),&(p->score[2]),&(p->score[3]),&(p->score[4]),&(p->score[5])); 少了两个%d
大神! 再看看这个!!
编程萝卜 2013-12-20
  • 打赏
  • 举报
回复
这个是向文件输入数据的
fwrite(p,sizeof(struct achieve),1,pf);
结构文件里面的数据全错了..... 如下,求助!!!! gdg 烫烫烫烫烫烫烫烫? 4 ? ? 烫烫烫烫烫烫
Meteor_Code 2013-12-20
  • 打赏
  • 举报
回复
scanf("%d%s%d%d%d%d%d%d",&(p->num),(p->name),&(p->score[0]),&(p->score[1]),&(p->score[2]),&(p->score[3]),&(p->score[4]),&(p->score[5])); 少了两个%d

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧