制作初学者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]的内存位置。年龄
for
i==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 ; ... ) { ... }