user-0 提问: C语言新手求助！！

回复:
user: user-1
content: #include<stdio.h> #include<string.h>  //定义学生结构体 struct student {     char id[20];     char name[20];     char grade[20];     char class[20];     char zhuanye[20];     float mark1;     float mark2;     float mark3;     float average;     float total; }; struct student number[1000];//定义学生结构体数量组 int num = 0;  void student_add()//添加学生信息 {     while (1)     {         printf("请输入学号:");         gets(number[num].id);         getchar();         printf("请输入姓名:");         gets(number[num].name);         getchar();         printf("请输入年级:");         gets(number[num].grade);         getchar();         printf("请输入班级:");         gets(number[num].class);         getchar();         printf("请输入专业:");         gets(number[num].zhuanye);         getchar();         printf("请输入成绩1:");         scanf_s("%f", &number[num].mark1);         //getchar();         printf("请输入成绩2:");         scanf_s("%f", &number[num].mark2);         //getchar();         printf("请输入成绩3:");         scanf_s("%f", &number[num].mark3);         getchar();         num++;         printf("是否进行其他操作?(y/n)");         if (getchar() == 'n')         {             break;         }     } } 试一下上面的代码； 不建议使用gets，可以用fgets替换，也可以用scanf_s

user: user-2
content: 那么多的gets，getchar，你认真数一下是不是敲多了

user: user-3
content: #include<stdio.h> #include<string.h> # define N 20 //定义学生结构体 struct student { 	char S[5][N+1]; //0 ID   1  NAME 2 GRADE   3 CLASS   4 ZHUANYE 	double mark[5];  //mark1    mark2    mark3   average   total }; struct student number[1000];//定义学生结构体数量组 void student_add(); double gaindouble(double *p,int a,int b);//输入int *p直至满足[a,b]输入结束，返回*p int gainchar(char *A,int min,int max);//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度       int main(){ 	student_add(); 	return 0; } void student_add()//添加学生信息 { 	char F='Y',A[][5]={"学号","姓名","年级","班级","专业","语文","数学","英语"}; 	int  i,j,B[2][8]={{8,4,4,4,8,1,1,1},{10,8,8,8,N,100,100,100}};     for(i=0;i<1000&&(F=='Y'||F=='y');i++) 	{ 		for(j=0;j<8;j++) 		{ 			if(j<5) 			{ 				printf("请输入第%d个学生%s--[%d,%d]个字节:",i+1,A[j],B[0][j],B[1][j]); 				gainchar(number[i].S[j],B[0][j],B[1][j]); 			} 			else{ 				printf("请输入第%d个学生的%s成绩--[%d.00,%d.00]:",i+1,A[j],B[0][j],B[1][j]); 				number[i].mark[4]+=gaindouble(&number[i].mark[j-5],B[0][j],B[1][j]); 			} 		} 		printf("是否进行继续录入？(Y/N):"); 		F=getchar(); 	} }    double gaindouble(double *p,int a,int b)//输入int *p直至满足[a,b]输入结束，返回*p       {            do{               *p=a-1;             scanf("%lf",p);               while(getchar()!='\n');               if(*p>b||*p<a)                   printf("输入有误,请重新输入--[%d,%d]:\n",a,b);           }while(*p>b||*p<a);           return *p;       }       int gainchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度             {                 int B,C;           	do{                     A[max]=B=C=0;                 while((A[B++]=getchar())!='\n'&&B<max);                 if(A[B-1]!='\n')while(getchar()!='\n'&&++C);                     else A[--B]=0;          		if(C||B&&B<min)         			printf("您录入的字符串长度:%d字节\n只录入[%d,%d]个字节!\n",B+C,min,max);                 }while(C||B<min);                 return B;           }

user: user-3
content: #include<stdio.h> #include<string.h> # define N 20 //定义学生结构体 struct student { 	char S[5][N+1]; //0 ID   1  NAME 2 GRADE   3 CLASS   4 ZHUANYE 	double mark[5];  //mark1    mark2    mark3   average   total }; struct student number[1000];//定义学生结构体数量组 void student_add(); double gaindouble(double *p,int a,int b);//输入int *p直至满足[a,b]输入结束，返回*p int gainchar(char *A,int min,int max);//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度       int main(){ 	student_add(); 	return 0; } void student_add()//添加学生信息 { 	char F='Y',A[][5]={"学号","姓名","年级","班级","专业","语文","数学","英语"}; 	int  i,j,B[2][8]={{8,4,4,4,8,1,1,1},{10,8,8,8,N,100,100,100}};     for(i=0;i<1000&&(F=='Y'||F=='y');i++) 	{ 		for(j=0;j<8;j++) 		{ 			if(j<5) 			{ 				printf("请输入%s--[%d,%d]个字节:",A[j],B[0][j],B[1][j]); 				gainchar(number[i].S[j],B[0][j],B[1][j]); 			} 			else{ 				printf("请输入%s的成绩--[%d.00,%d.00]:",A[j],B[0][j],B[1][j]); 				number[i].mark[4]+=gaindouble(&number[i].mark[j-5],B[0][j],B[1][j]); 			} 		} 		printf("是否进行其他操作？(Y/N):"); 		F=getchar(); 	} }    double gaindouble(double *p,int a,int b)//输入int *p直至满足[a,b]输入结束，返回*p       {            do{               *p=a-1;             scanf("%lf",p);               while(getchar()!='\n');               if(*p>b||*p<a)                   printf("输入有误,请重新输入--[%d,%d]:\n",a,b);           }while(*p>b||*p<a);           return *p;       }       int gainchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度             {                 int B,C;           	do{                     A[max]=B=C=0;                 while((A[B++]=getchar())!='\n'&&B<max);                 if(A[B-1]!='\n')while(getchar()!='\n'&&++C);                     else A[--B]=0;          		if(C||B&&B<min)         			printf("您录入的字符串长度:%d字节\n只录入[%d,%d]个字节!\n",B+C,min,max);                 }while(C||B<min);                 return B;           }      希望能帮到你  我的QQ2423824433

user: user-4
content: 建议使用 fgets(number[num].id, 20, stdin)读取字符串 然后getchar()语句统统删除