制作初学者C程序,按年龄对学生进行阅读和分类
代码:制作初学者C程序,按年龄对学生进行阅读和分类,c,arrays,sorting,data-structures,C,Arrays,Sorting,Data Structures,代码: #包括 typedef结构人{ 智力年龄; 字符名[40]; }人; 无效烫发(人*A,人*B){ 个人临时工; 温度=*A; *A=*B; *B=温度; } 空干管(){ 个人教室[6]; int i,j; //阅读学生姓名和年龄 对于(i=0;i我进行了快速检查,发现代码中至少有3个主要错误: 1) 当您查找学生姓名时,您会遇到麻烦,因为“\n”在scanf中没有正确处理,要正确处理,您需要使用“\n”,例如,您可以在scanf后面直接添加getc(),就像我在以下代码段中所做的那样
#包括
typedef结构人{
智力年龄;
字符名[40];
}人;
无效烫发(人*A,人*B){
个人临时工;
温度=*A;
*A=*B;
*B=温度;
}
空干管(){
个人教室[6];
int i,j;
//阅读学生姓名和年龄
对于(i=0;i我进行了快速检查,发现代码中至少有3个主要错误:
1) 当您查找学生姓名时,您会遇到麻烦,因为“\n”在scanf中没有正确处理,要正确处理,您需要使用“\n”,例如,您可以在scanf后面直接添加getc(),就像我在以下代码段中所做的那样:
#include <stdio.h>
typedef struct person {
int age ;
char name[40];
}person;
void perm ( person * A , person * B ){
person temp ;
temp = *A ;
*A = *B ;
*B = temp ;
}
void main () {
person classroom[6];
int i , j ;
// reading students name and ages
for ( i=0 ; i<6 ; i++ ){
printf("Enter name :");
fgets (classroom[i].name, 40, stdin);
printf("Enter age : ");
scanf("%d",&classroom[i].age);
}
// sorting them
for ( i=0 ; i<6 ; i++ ){
for ( j=0 ; j<6-i ; j++ ){
if ( classroom[j].age > classroom[j+1].age ){
perm (&classroom[j],&classroom[j+1]);
}
}
}
// printing them sorted
printf("\n After sorting accoring to ages :");
for ( i=0 ; i<6 ; i++ ){
printf(" %s \n",classroom[i].name[40]);
}
// finished
getchar();
getchar();
}
您必须使用以下各项:
printf(" %s \n",classroom[i].name[40]);
好的,这个问题应该被纠正成一个适当的问题,这样它可能会成为一个适当的堆栈溢出条目。有了这段代码,您将有四个问题:
1-为什么在没有首先输入第二名(及后续)学生的姓名的情况下,系统会提示我输入其年龄
2-为什么我会遇到此代码的访问冲突(或分段错误,等等)?
3-为什么我仍然遇到访问冲突?
4-为什么名称显示为双线分隔符
对于第一个问题,stdin
是一个缓冲输入。我可能缺少缓冲含义的真正定义,但您和我应该知道,当您键入时:
printf(" %s \n", &classroom[i].name[0]);
将以下内容推入stdin
缓冲区内:
20*pressTheEnterKey*
前两个字符由您调用的scanf
获取并使用,因为它们对于%d
类型说明符很有价值。但是,新行字符\n
被保留
在下一次调用fgets
时,您要求从stdin
输入一个字符流,直到找到一个已经提供的新行字符。fgets
将新行存储在教室[i]中。命名,然后继续
你不会想要的,对吧
要防止这种情况发生,您必须放弃该\n
,为此,您有两种选择:
fflush(stdin);
call,我个人使用它是因为它适合我,所以
while(getchar()!='\n');
还应丢弃缓冲区中剩余的所有字符,直到换行符,包括换行符
现在进入第二个问题;在嵌套的for
循环中,您试图访问教室[6]的内存位置。年龄fori==0
和j==5
。该位置超出了个人教室[6]的限制;
包括:从教室[0]
到教室[5]
很容易修复,只需将
的内部条件更改为:
'2' '0' '\n'
(…;j<5-i;…){…}
关于你的第三个问题;这一次你试图访问存储位置教室[i].name[40]
,这是任何i
都无法访问的。此外,即使不是教室[i]。name[n]
会为每个n:0指向一个字符,你的问题应该是…?你似乎没有问问题。请具体点。我们应该为你写作业吗?
printf(" %s \n", &classroom[i].name[0]);
20*pressTheEnterKey*
'2' '0' '\n'
for ( ... ; j < 5 - i ; ... ) { ... }