user-0 提问: 请高手指导代码bug

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: #include<stdio.h> #include<malloc.h> typedef int score; typedef int number; typedef  char sex; typedef char name; //extern  int N; int N; struct student { 	name nam[100]; 	sex s; 	number num; 	score sc; }; void seq_student(struct student *p)  //插入函数// { 	int m,j; 	struct student *q; 	printf("请检查你输入的信息是否有遗漏。若有遗漏请输入数字'1':"); 	scanf("%d",&j);	 	if(j==1)  { 		printf("输入遗漏的位置\n:"); 		scanf("%d",&m); 		p=p+m-1; 		q=p; 		printf("输入遗漏的学生信息\n:"); 		scanf("%s%c%d%d",&p->nam[100],&p->s,&p->num,&p->sc); 		while(m<N) 		{ 			++m; 			p=q; 		} 	} } void serach_for_student(struct student *p)    //查找学生信息// { 	int nu,i; 	printf("输入学生的学号:"); 	scanf("%d",&nu); 	for(i=0;i<=N;i++) 	{ 		if(nu==p->num) 			printf("%s%c%d%d",p->nam[100],p->s,p->num,p->sc); 		else printf("该学生不存在"); 	} } void main() { 	int i; 	struct student *stu=NULL; 	printf("请输入学生的个数\n:"); 	scanf("%d",&N);  	stu=(struct student*)malloc(sizeof(struct student)*N); 	printf("请输入学生的姓名、性别、学号及该学科成绩\n:"); for(i=0;i<N;i++) scanf("%s%c%d%d",&stu[i].nam[100],&stu[i].s,&stu[i].num,&stu[i].sc); 	//seq_student(struct student stu); 	seq_student(stu); 	//serach_for_student(struct student stu); 	serach_for_student(stu); }

user: user-3
content: 另外，多注意类型；地址和值的关系；scanf要求变量的地址；

user: user-3
content: #include<stdio.h> #include<malloc.h>   typedef int score; typedef int number; typedef char sex; typedef char name;  int N;  struct student {   name nam[100];   sex s[16];   number num;   score sc; }; void seq_student (struct student *p)	//插入函数// {   int m, j;   struct student *q;   printf("请检查你输入的信息是否有遗漏。若有遗漏请输入数字'1':");   scanf ("%d", &j);   if (j == 1){        printf ("输入遗漏的位置\n:");       scanf ("%d", &m);       p = p + m - 1;       q = p;       printf ("输入遗漏的学生信息\n:");       scanf ("%s%s%d%d", p->nam, p->s, &p->num, &p->sc);     while (m < N) 	{ 	  ++m; 	  p = q; 	}   } }  void serach_for_student (struct student *p)	//查找学生信息// {   int nu, i;   printf ("输入学生的学号:");   scanf ("%d", &nu);   for (i = 0; i <= N; i++)     {       if (nu == p->num) 	    printf ("%s%s%d%d", p->nam, p->s, p->num, p->sc);       else 	printf ("该学生不存在");     } }  int main (void) {   int i;   struct student *stu = NULL;   printf ("请输入学生的个数\n:");   scanf ("%d", &N);   stu = (struct student *) malloc (sizeof (struct student) * N);   if (NULL == stu) {     printf("Malloc error!\n");     return -1;   }   printf ("请输入学生的姓名、性别、学号及该学科成绩\n:");   for (i = 0; i < N; i++)     scanf ("%s%s%d%d", stu[i].nam, stu[i].s, &(stu[i].num), &(stu[i].sc));   seq_student (stu);   serach_for_student (stu);   return 0; }   注意的地方：scanf输入时对于%c的输入尤为小心；因为它是接收一个字符，空格，回车很可能会被其接收；那么你输入学生信息时注意；要么把它和其他信息输入分开，要么可以考虑用其他类型表述这个信息；我上面用了字符串；（性别：male, female）；否则通过测试你会发现，你正常输入的会充斥到seq_student()函数中；导致改函数中的输入被上次的输入充斥；

user: user-4
content: Main 函数里面， N没有声明。

user: user-4
content: 哦， 在这里定义了。 extern  int N;

user: user-5
content: 最后两句 seq_student(struct student stu); serach_for_student(struct student stu); 改为 seq_student(stu); serach_for_student(stu);

user: user-6
content: seq_student(struct student stu);改为seq_student(stu); serach_for_student(struct student stu);改为serach_for_student(stu); 传参不需要加上结构体类型名  #include<stdio.h> #include<malloc.h> typedef int score; typedef int number; typedef  char sex; typedef char name; extern  int N; struct student { 	name nam[100]; 	sex s; 	number num; 	score sc; }; void seq_student(struct student *p)  //插入函数// { 	int m,j; 	struct student *q; 	printf("请检查你输入的信息是否有遗漏。若有遗漏请输入数字'1':"); 	scanf("%d",&j);	 	if(j==1)  	{ 		printf("输入遗漏的位置\n:"); 		scanf("%d",&m); 		p=p+m-1; 		q=p; 		printf("输入遗漏的学生信息\n:"); 		scanf("%s%c%d%d",&p->nam[100],&p->s,&p->num,&p->sc); 		while(m<N) 		{ 			++m; 			p=q; 		} 	} } void serach_for_student(struct student *p)    //查找学生信息// { 	int nu,i; 	printf("输入学生的学号:"); 	scanf("%d",&nu); 	for(i=0;i<=N;i++) 	{ 		if(nu==p->num) 			printf("%s%c%d%d",p->nam[100],p->s,p->num,p->sc); 		else printf("该学生不存在"); 	} } void main() { 	int i; 	struct student *stu=NULL; 	printf("请输入学生的个数\n:"); 	scanf("%d",&N);  	stu=(struct student*)malloc(sizeof(struct student)*N); 	printf("请输入学生的姓名、性别、学号及该学科成绩\n:"); 	for(i=0;i<N;i++) scanf("%s%c%d%d",&stu[i].nam[100],&stu[i].s,&stu[i].num,&stu[i].sc); 	seq_student(stu); 	serach_for_student(stu); }