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++;
        }
}
阅读 4.7k
3 个回答

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

#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";
    }
}

这样改改试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进