c语言结构体数组无法运行?

#include <stdio.h>
#include <stdlib.h>

void passOrdown(struct student *);
void output(struct student *);

struct student {
                char name[20];
                int score;
                char *passdown;
        };

int main()
{
        struct student stu[3];
        int i;
        for (i=0; i<3; i++) {
        printf("请输入第#%d位同学的姓名: ", i+1);
        scanf("%s", stu[i].name);

        printf("请输入第#%d位同学c语言的分数:", i+1);
        scanf("%d", &stu[i].score);
        printf("\n");
        }
        passOrdown(stu);
        output(stu);
        return 0;
}
void passOrdown(struct student *p)
{
        int i;
        for (i=0; i<3; i++) {
                if (p->score >= 60)
                        p->passdown = "pass";
                else
                        p->passdown = "down";
        }
}

void output(struct student *q)
{
        int i;
        printf("\n\n%10s %10s %20s\n", "Name", "Score", "Passdown");
        for (i=1; i<42; i++)
                printf("=");
        printf("\n");
        for (i=0; i<3; i++) {
                printf("%10s %10d %20s\n", q->name, q->score, q->passdown);
                q++;
        }
}
阅读 2.7k
评论
    3 个回答
    • 11.8k

    改动部分及原因见注释,以下代码可以直接运行

    #include <stdio.h>
    #include <stdlib.h>
    
    struct student {
                    char name[20];
                    int score;
                    char *passdown;
            };
    
    void passOrdown(struct student *);   // 这里用到了student,要先声明,所以student
    void output(struct student *);       // 的定义要放在前面,然后才是函数声明
    
    int main()
    {
            struct student stu[3];
            int i;
            for (i=0; i<3; i++) {
            printf("请输入第#%d位同学的姓名: ", i+1);
            scanf("%s", stu[i].name);
    
            printf("请输入第#%d位同学c语言的分数:", i+1);
            scanf("%d", &stu[i].score);
            printf("\n");
            }
            passOrdown(stu);
            output(stu);
            return 0;
    }
    void passOrdown(struct student *p)
    {
            int i;
            for (i=0; i<3; i++) {
                    if (p[i].score >= 60)      // p是student的数组 ,不是一个student
                            p[i].passdown = "pass";
                    else
                            p[i].passdown = "down";
            }
    }
    
    void output(struct student *q)
    {
            int i;
            printf("\n\n%10s %10s %20s\n", "Name", "Score", "Passdown");
            for (i=1; i<42; i++)
                    printf("=");
            printf("\n");
            for (i=0; i<3; i++) {
                    printf("%10s %10d %20s\n", q->name, q->score, q->passdown);
                    q++;
            }
    }
    

      1)结构体要在函数声明之前。不能这样:
      以下错误❌:
      void passOrdown( struct student p);
      struct student{
      ......;/
      省略相关字段/
      };/
      这样的话肯定是要出错的---你开始就使用struct student但是却没有一开始就声明/
      2)定义void passOrdown(struct student *p)时有错误。你在main()里面给passOrdown这个函数传的是数组名,这个没错!
      ##接下来,跟我念十遍##
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      一旦指针p指向了数组(就像你的函数),就可以忽略p是指针这个事实,并且p可以作为数组名。
      /*************************************************************************/
      /
      于是你的函数就可以这样写了*/

      void passOrdown( struct student *p )
      {
          int i = 0;
          for( i=0; i<3; i++)
          {
              if( p[i].score >= 60 )
                  p[i].passdown = "pass";
              else
                   p[i].passdown = "down";
          }
      }
      

      /**** Understand ?! ****/

        void passOrdown(struct student *p)
        {
            int i;
            for (i=0; i<3; i++) {
            if (p[i].score >= 60)
                p[i].passdown = "pass";
            else
                p[i].passdown = "down";
            }
        }
        

        这样改改试试

          撰写回答

          登录后参与交流、获取后续更新提醒

          相似问题
          推荐文章