【问题标题】:Functions containing Array of Structures in CC中包含结构数组的函数
【发布时间】:2016-08-30 15:53:43
【问题描述】:

我创建了这个结构来存储条目,但是当我计算总数时,我得到一个垃圾值。我经历了很多次,但仍然找不到错误。我也尝试初始化总数,但无法得到他需要的答案。每次我计算总数时,它都会给出与之前相同的垃圾值。

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    char name[50];
    int Assignment[5];
    int Test[2];
    int Endsem;
    int Total;



}student;
void read(student s[],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("Enter the name of the student");
        scanf("%s",&(s[i].name));
        printf("Enter the assignment marks \n ");
        for(j=0;j<5;j++)
        {
            scanf("%d",&(s[i].Assignment[j]));
        }
        printf("\n Enter the Test marks \n ");
        for(j=0;j<2;j++)
        {
            scanf("%d",&(s[i].Test[j]));
        }
        printf("\n Enter the EndSem marks \n");
        scanf("%d",&(s[i].Endsem));
        printf("\n \n ");
    }
}
void compute(student s[],int n)
{
    int i,j,d=0,m=0;

    for(i=0;i<n;i++)
    {
        s[i].Total=0;
        for(j=0;j<5;j++)
        {
          d+=(s[i].Assignment[j]);
        }
        for(j=0;j<2;j++)
        {
           m+=(s[i].Test);
        }
        s[i].Total=(d+m+(s[i].Endsem));
        printf("\n The total is %d out of 100",(s[i].Total));
    }
}
void display(student s[],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("The entries are");
        printf("%s",(s[i].name));
        printf("assignment marks \n ");
        for(j=0;j<5;j++)
        {
            printf(" \n %d",(s[i].Assignment[j]));
        }
        printf("\nTest marks \n ");
        for(j=0;j<2;j++)
        {
            printf("%d \n ",(s[i].Test[j]));
        }
        printf("\n EndSem marks \n");
        printf("%d \n",(s[i].Endsem));
    }
}
void main()
{
    student s[1];

    read(s,1);
    display(s,1);
    compute(s,1);
}

如何解决?

【问题讨论】:

  • 因为您在计算之前显示?这意味着您将打印 uninitialized 变量的值,该变量的值将是 indeterminate 并导致 undefined behavior
  • 欢迎来到 Stack Overflow。你可以改进你的问题。请阅读Minimal, Complete, and Verifiable example。当您的代码不加赘述地显示您的确切问题时,您就是在尊重那些自愿帮助您的人。
  • 旁注:scanf("%s",&amp;(s[i].name)); --> scanf("%49s",s[i].name);
  • ...即使这样,第一个空格也会结束扫描,因此Weather Vane 将被截断为Weather

标签: c arrays pointers structure


【解决方案1】:

问题出在

  m+=(s[i].Test);

Test 是一个数组,而不是普通的(标量)变量。它指向(或衰减到)数组第一个元素的起始地址。将其添加到int 没有意义这里

你可能想写

 m+=(s[i].Test[j]);

也就是说,正如我已经评论过的,您应该为

重写 scanf() 语句
  • 包括最大字段宽度以防止缓冲区溢出,例如 scanf("%49s",...) 用于数组大小为 50 的参数
  • 传递数组名称,而不是数组的地址,因为%s 需要一个指向字符数组的指针,例如scanf("%49s",s[i].name);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多