关于C读文件strcmp函数比较字符串

风-之-谷 2014-03-02 02:45:26
Sno Sname Ssex Sage Sdept
20120001 李勇 男 20 CS
20120002 刘晨 女 19 CS
20120003 王敏 女 18 MA
20120005 张立 男 19 IS
读文本文件,查询信息



#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<process.h> // exit()
#define TRUE 1 // 函数结果状态代码
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define NULL 0

typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等


typedef struct Student{
char Sno[8];
char Sname[20];
char Ssex[2];
int Sage;
char Sdept[2];
struct Student *next;
}Student,*LinkList;


Status InitList(LinkList &L){ //构造一个空表
L=(Student*)malloc(sizeof(Student));
if(L!=NULL){
printf("电脑空间不足!\n");
return ERROR;
}
L->next=NULL;
return OK;
}


Status ReadStudent(LinkList &L){ //读取Student文件
Student *s,*p;
FILE *fp;
char buf[1024];
s=L;
fp=fopen("F:\\Student.txt","r+");
fgets(buf,1024,fp); //跳过第一行
while(fgets(buf,1024,fp)!=NULL){ //读取每一行数据,直至读完
p=(Student*)malloc(sizeof(Student));
sscanf(buf,"%s %s %s %d %s ",p->Sno,p->Sname,p->Ssex,&(p->Sage),p->Sdept);
s->next =p;
s=p;
p->next =NULL;
}
fclose(fp);
return OK;
}



Status Search_PutoutStudent(LinkList L){ //根据学号输出学生的信息
char sno[8];;
Student *s=L;;
printf("请输入你所要查询学生的学号:\n");
scanf("%s",sno);
while(s->next!=NULL && strcmp(s->next->Sno,sno))
s=s->next;
if(s==NULL){
printf("您所输入的学号有误,不存在此学号的学生。\n");
return ERROR;
}
printf("学号\t姓名\n性别\t年龄\t系别\n");
printf("%s\t%s\t%s\t%d\t%s \n",s->Sno,s->Sname,s->Ssex,s->Sage,s->Sdept);
return OK;
}

void main(){
LinkList L;
InitList(L);
ReadStudent(L);
Search_PutoutStudent(L);
}


调试时,输入20120001strcmpy()函数返回不是0
...全文
199 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
风-之-谷 2014-03-03
  • 打赏
  • 举报
回复
感谢 ,又学到了不少。
mangoalx 2014-03-03
  • 打赏
  • 举报
回复
因为字符串是以数字0结尾的('\0')。定义短了以后结尾的0被下一个数据姓名冲掉了,计算机在输出时一直输出到姓名结尾的0处才会停
mujiok2003 2014-03-02
  • 打赏
  • 举报
回复
小心中文字符编码
logiciel 2014-03-02
  • 打赏
  • 举报
回复
出错原因是struct Student中的char Sno[8]长度不够,要改为char Sno[8+1]; 还要修改以下行: if(L==NULL){ //if(L!=NULL){ printf("电脑空间不足!\n"); Status Search_PutoutStudent(LinkList L){ //根据学号输出学生的信息 char sno[8+1];//char sno[8];; Student *s=L->next;//Student *s=L;; while(s!=NULL && strcmp(s->Sno,sno)) //while(s->next!=NULL && strcmp(s->next->Sno,sno)) printf("学号\t姓名\t性别\t年龄\t系别\n");//printf("学号\t姓名\n性别\t年龄\t系别\n");
风-之-谷 2014-03-02
  • 打赏
  • 举报
回复
为什么字符串定义短了,但是输出时却是学号和姓名连在一起输出了? 大神 求解答!!

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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