user-0 提问: C语言代码错误  不能正常运行 求大神们指正

回复:
user: user-1
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: fread和fwrite是二进制读取和写入，所以你看到的是乱码

user: user-0
content: 修正之后 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct student//定义学生 {    char name[10];    long long number;    char sex[2];    int math;    int english;    int cyuyan;    int sum;    }student;    typedef struct unit//定义接点    {    	student date;    	struct unit *next; 	} unit; 	unit* build()//建立链表并返回指针 	{ 	unit *p; 	if((p=(unit*)malloc(sizeof(unit)))==NULL){ 		printf("=>初始化失败！"); 		return 0;	 	} 	else{ 		p->next=NULL; 		p->date.number=0; 		printf("初始化成功！\n"); 		return p;	 	} 	}     void add(unit *head)//增加学生  { 	unit *p,*q; 	int m,n=0; 	q=head->next; 	p=(unit*)malloc(sizeof(unit)); 	printf("=>请输入新生姓名\n"); 	gets(p->date.name);fflush(stdin); 	printf("=>请输入学生学号！\n"); 	while(n==0){ 		scanf("%d",&m);fflush(stdin); 	   	if(q==NULL)n=1; 		while(q){ 			if(q->date.number==m){ 				printf("=>你输入的学号与已有学生的学号相同，请重新输入！\n"); 				q=head->next; 				break;	  			} 			else{ 				q=q->next; 				if(q=NULL)n=1; 			} 	} 	 p->date.number=m;} printf("=>请输入性别！\n"); gets(p->date.sex);fflush(stdin); printf("=>请输入数学成绩\n"); scanf("%d",&m);fflush(stdin); p->date.math=m; printf("=>请输入英语成绩\n"); scanf("%d",&m);fflush(stdin); p->date.english=m; printf("=>请输入c语言成绩\n"); scanf("%d",&m);fflush(stdin); p->date.cyuyan=m; p->date.sum=(p->date.math+p->date.english+p->date.cyuyan); q=head->next; head->next=p; p->next=q; head->date.number++; }  void deletion(unit *head)//删除一名学生 { 	unit *p=head->next,*q=head; 	char N[10]; 	printf("=>请输入你想要删除的学生姓名！\n"); 	gets(N);fflush(stdin); 	if(p==NULL)  	printf("=>系统无学生可删除！\n"); 	while(p){ 		if(strcmp(p->date.name,N)==0){ 			q->next=p->next; 			head->date.number--; 			printf("=>删除%s成功！\n",p->date.name); 			free(p); 			break;	 		} 		else{ 			p=p->next; 			q=q->next; 			if(p==NULL) 			printf("=>你要删除的学生不存在，删除失败！\n"); 			 		}	 	}	  }    int display(unit *head)//显示学生信息 统计汇总   {  	unit *p=head->next;  	int m,n=0;  	char N[10];  	if(p==NULL){  		printf("=>系统无学生！\n");  		return 0;  	 } 	 while(n==0){ 	 	printf("-------------------------\n"); 	 	printf("=>请选择你的操作！\n"); 		printf("=>\t\t\t1.显示所有\t2.按姓名查找\n\t\t\t3.按学号查找\t4.返回主菜单\n"); 	 	scanf("%d",&m); 		fflush(stdin); 		switch(m) 		{ 		case 1:printf("\n=>该系统拥有%d名学生！\n\n",head->date.number); 		p=head->next; 		printf("\t姓名\t学号\t性别\t数学\t英语\tc语言\t综合\n\n"); 		while(p){ 			printf("\t%s\t%d\t%s\t%d\t%d\t%d\t%d\n",p->date.name,p->date.number,p->date.sex,p->date.math,p->date.english,p->date.cyuyan,p->date.sum); 			p=p->next;	 		} 		break;	 		case 2:printf("=>请输入查找姓名！\n"); 		gets(N);	 		fflush(stdin); 		p=head->next;  		while(p){ 			if(strcmp(p->date.name,N)==0){ 				printf("\t姓名\t学号\t性别\t数学\t英语\tc语言\t综合\n"); 				printf("\t%s\t%d\t%s\t%d\t%d\t%d\t%d\n",p->date.name,p->date.number,p->date.sex,p->date.math,p->date.english, 				p->date.cyuyan,p->date.sum); 				break; 	 			}else{ 			p=p->next; 			if(p==NULL) 			printf("=>你要查的学生不存在！\n");	 				 			} 		}break; 		case 3:printf("=>请输入查找学号！\n"); 		scanf("%d",&m); 		fflush(stdin); 		p=head->next; 		while(p){ 			if(p->date.number==m){ 			printf("\t姓名\t学号\t性别\t数学\t英语\tc语言\t综合\n");	 				printf("\t%s\t%d\t%s\t%d\t%d\t%d\t%d\n",p->date.name,p->date.number,p->date.sex,p->date.math,p->date.english, 				p->date.cyuyan,p->date.sum); 				break; 			}else{ 				p=p->next; 			if(p==NULL) 			printf("=>你要查的学生不存在！\n");		 			}		 		}	 		break; 		 case 4:n=1;break; 			}	 	 } 	 return 1;   }    int range(unit *head)//排序   {   	unit *p=head,*q=head->next;   	int n,i,m=head->date.number;   	printf("--------------------------\n");   	printf("\t\t\t1.按学号\t2.按成绩\n\n");   	printf("=>请选择操作！\n");	   	scanf("%d",&n); 	fflush(stdin) ; 	if(q==NULL){ 			printf("=>无学生可排序！\n"); 			return 0;		 	}  	switch(n){ 		case 1:for(i=0;i<=m;i++){ 			p=head;q=head->next; 			while(q->next){ 				if((q->date.number)>(q->next->date.number)){ 					p->next=q->next; 					p=p->next; 					q->next=p->next; 					p->next=q;	 				}else{ 					p=p->next;q=q->next;	 				} 			} 		}	break; 		}	 		printf("=>排序成功！\n"); 		return 1;   }   void menu(){   	printf("-------------主菜单------------------\n");   	printf("\t1.新建系统\t2.添加学生\n\t3.删除学生\t4.查看信息\n\t5.排列顺序\t6.读取信息\n\t7.保存信息\t8.退出系统\n");   	printf("-------------------------------------\n");     printf("=>请输入你的操作！\n");   } int save(unit *head)//保存   {   	FILE *fp; 	  unit *p; 	  p=head; 	  if((fp=fopen("xuesheng.txt","wb+"))==NULL) 	  { 	  printf("=>保存失败！\n");	 	  	return 0; 	 	  }   	while(p){   		fwrite(&(p->date),sizeof(student),1,fp);   		p=p->next; 	  }   	printf("=>保存成功！\n");   	fclose(fp);   	return 1;    }      unit* read()//读入系统学生信息    {    	int i;    	unit *p,*q,*head;    	FILE *fp;    	if((head=(unit*)malloc(sizeof(unit)))==NULL){    		printf("=>开发空间失败！\n");    		exit(1);  	   }    	else{    		head->next=NULL;    		head->date.number=0;//头结点存放学生人数; 	   }    	q=head;    	if((fp=fopen("xuesheng.txt","ra"))==NULL){    		printf("=>系统无学生！\n");    		return 0; 	 	   }    	fread(&(q->date),sizeof(student),1,fp);    	for(i=0;i<head->date.number;i++){    		if((p=(unit*)malloc(sizeof(unit)))==NULL)    		{    		printf("=>读值失败！\n");    		exit(1); 		   }    			fread(&(q->date),sizeof(student),1,fp);    		p->next=q->next;    		q->next=p; 	   }    		fclose(fp); 	return head; 	}  int main(){ 	int m=0,n,i; 	unit *head; 	printf("--------------------------------------------------------------------------\n"); 	printf("\t\t\t* 欢迎使用学生成绩管理系统 *！\n"); 	printf("\n\t\t\t\t\t\t\t\t\t\t\t\t\t编译学生：王亚辉\n\n"); 	printf("正在读取系统信息。。。。。。\n"); 	if((head=read())==0){ 		printf("=>是否新建?！\n"); 		printf("\t\t\t是(1)\t\t否(2)\n"); 		scanf("%d",&i); 		fflush(stdin); 		if(i==1) 		head=build();	 		else if(i==2) 			exit(1); 		} 		else 			printf("=>信息导入成功！\n");  	 	while(m==0){ 				menu(); 				scanf("%d",&n); 				fflush(stdin); 				switch(n){ 					case 1:head=build();break; 					case 2:add(head);break; 					case 3:deletion(head);break; 					case 4:display(head);break; 					case 5:range(head);break; 					case 6:head=read();if(head!=0) printf("=>读取存盘成功！\n");break; 					case 7:save(head);break; 					case 8:m=1;break; 	 				} 				 			}		 		}   但是每次存盘还正常 但是再次打开这个程序显示的时候显示的就是乱码了 是不是保存或者读取那块出问题了 求大神教我 帮我指正

user: user-1
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-1
content: 机器人有时比真人更擅长解决因机器不听人话导致的各种问题。

user: user-2
content: 保存失败是因为if((fp=fopen("d:\\学生","wb+"))==NULL); 其实并不是创建文件失败了，把后面的分号去掉，修改为if((fp=fopen("d:\\学生","wb+"))==NULL) 还有 printf("=>请输入数学成绩\n"); 下面的 scanf("%d,&m");//双引号位置不正确 拼写错误，修改为scanf("%d“,&m);

user: user-3
content: 引用 6 楼 qq423399099 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  你这怎么和别的帖子里的回答一样……还不是你发的，你也是机器人？

user: user-4
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 谢谢  对了 save这块儿总是保存失败 怎么办？

user: user-5
content: if((head=(unit*)malloc(sizeof(unit)))=NULL){  后面那个 = 改成 ==   判断是否相等用的是==

user: user-0
content: 不一样  谢谢您 解决了我的问题

user: user-0
content: 修改后的和修改前的怎么一样？

user: user-0
content: lilianjie001 谢谢您帮我解决了问题

user: user-2
content: if((head=(unit*)malloc(sizeof(unit)))=NULL) 错误 这样等于head=(unit*)malloc(sizeof(unit));head=NULL 修改为if((head=(unit*)malloc(sizeof(unit)))==NULL)即可