运行时错误:C中学生详细信息的结构

时间:2018-05-29 07:41:58

标签: c runtime-error

这是一个使用Structures来提供和显示学生详细信息的C程序。运行时程序会遇到逻辑错误。我无法找到原因。请帮助,如果可能,请发布正确的代码。

编辑:我之前有分段错误,然后根据本文中的一条评论(@CiaPan)编辑了代码,发现运行代码时仍然存在逻辑错误。

      #include <stdio.h>

      struct student
      {
      char name[100];
      int roll,mark[100];
      float average;
      }a[100];

      int main()

      {
      int n,i,j,m,sum;
      printf("enter the no. of students and no. of subjects : \n");
      scanf("\n%d\n%d",&n,&m); 
      printf("enter the student details : \n");
      for(i=0;i<n;i++)

      {   
      printf("\n%d",i+1);
      printf("\nenter the name :");
      scanf("%s",a[i].name);
      printf("\nenter the roll no.");
      scanf("%d",&a[i].roll);
      printf("\nmarks :\n");
      for(j=0;j<m;j++)
      {
      printf("%d.\t",j+1);
      scanf("%d\n",&a[i].mark[j]);
      }

      }    
      for(i=0;i<n;i++)
      { 
      sum=0;
      for(j=0;j<m;j++)
      sum=sum+a[i].mark[j];
           }
      for(i=0;i<n;i++) 
      a[i].average=sum/m;

      for(i=0;i<n;i++)
      if(a[i].average>=75)
      printf("\n%s\n%d\n",a[i].name,a[i].roll);
      return 0;

      }

我解决了这个问题。

Edit2:我在输出中遇到了一些错误。在用于获取标记的scanf函数中有一个错误,我更正了如图所示。由于与for循环相关的逻辑错误,计算平均值也存在问题。

 //Correct code

 #include <stdio.h>

      struct student
      {
      char name[100];
      int roll,mark[100];
      float average;
      }a[100];

      int main()

      {
      int n,i,j,m,sum;
      printf("enter the no. of students and no. of subjects : \n");
      scanf("\n%d\n%d",&n,&m); 
      printf("enter the student details : \n");
      for(i=0;i<n;i++)

      {   
      printf("\n%d",i+1);
      printf("\nenter the name :");
      scanf("%s",a[i].name);
      printf("\nenter the roll no.");
      scanf("%d",&a[i].roll);
      printf("\nmarks :\n");
      for(j=0;j<m;j++)
      {
      printf("%d.\t",j+1);
      scanf("\n%d",&a[i].mark[j]);
      }

      }   



      for(i=0;i<n;i++)
      { 
        sum=0;
      for(j=0;j<m;j++)
        sum=sum+a[i].mark[j];



      //for(i=0;i<n;i++) 
      a[i].average=sum/m;
      }


      for(i=0;i<n;i++)
      if(a[i].average>=75)
      printf("\n%s\n%d\n",a[i].name,a[i].roll);
      return 0;

      }

1 个答案:

答案 0 :(得分:1)

scanf函数需要知道它输入的数据存储位置。要做到这一点,它需要获取指向变量的指针来接收数据。因此,您必须将指针传递给int变量,而不是这些变量的值:

    scanf( "%d%d", &n, &m );

而不是

    scanf( "%d%d", n, m );

输入标记相同。

另一方面,数组的名称衰减为指向数组第一项的指针,所以当你需要输入一个chracter字符串时,你应该传递数组变量:

    scanf( "%s...", a[i].name, ... );

而不是

    scanf( "%s...", &a[i].name, ... );

因为&a[i].name是指向数组的指针,而你需要一个指向数组的第一个字符的指针。

此外,在对标记求和时,您应该为每个学生将sum重置为零。否则,除了第一个学生之外,每个学生都会累积所有以前学生的分数。

另外,您应该测试scanf的返回值,以确保输入数据已成功读取,并可能测试它们的一致性(例如,您的程序将接受否定标记......)。