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

编程萝卜 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 ;//学生信息结构体
...全文
303 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
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

33,316

社区成员

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

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