c语言程序不知道哪错了

#include"stdio.h"
struct student
{
int num;
char name;
int grade;
}s[2];
int main()
{
int i;
s[1]={"1001","zx"};
s[2]={"1002","xx"};
for(i=0;i<3;i++)
scanf("%d",s[i].grade);
}

第一个:结构体定义与申明建议不要写一起。

第二个:结构体的初始化,注意类型。int num类型初始化成字符串,char name初始化成字符串。

第三个:数组的下标从0开始引用。

第四个:主函数没有返回或调用exit(0)

第五个:struct结构初始化错误;

第六个:scanf,可变参数要传地址

正确的写法如下:

#include <stdio.h> /*标准库的头文件必须这么写,带双引号的是自己定义的头文件*/
#include <stdlib.h> /*可以使用exit()函数*/

/*语言中尽量不要使用幻数,看不出代表什么内容,因此*/
#define BUFSIZE 2
 
struct student {
    int num;
    char name[100];
    int grade;
};
 
/*主函数或入口函数推荐这样写*/
int main(void) {
    int i;
    struct student std[BUFSIZE]={{1001,"xz"},{1002,"xx"}};
    
    for(i=0;i < BUFSIZE; i++) {
        scanf("%d",&std[i].grade);
        /*检查输入是否对*/
        printf(
            "std[%d]:{num=%d,name=%s,grade=%d}\n",
            i,  
            std[i].num,
            std[i].name,
            std[i].grade
        );  
    }   
    
    /*0代表未出错返回,下面两种方式二选其一*/
    exit(0);
    /*return 0;*/
}

追问

为什么这样赋值不可以,另外下面又有问题了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-08-25

不能这样赋值。 

你可以

#include"stdio.h"
struct student
{
int num;
char name[10];
int grade;
}s[2]={{1001,"zx",1},{1002,"xx",2}};
int main()
{
int i;

for(i=0;i<2;i++)
scanf("%d\n",s[i].grade);
}

另外 注意只有2个元素。

追问

为什么不可以这样赋值

追答

规定

本回答被提问者采纳
第2个回答  2017-08-25

你新建了s[2],然后这两个数组元素应该是s[0]和s[1]啊,不是s[1]和s[2]。

后面for循环y也应该是i < 2。

看了楼下回答我想说说我的想法:

首先《代码简洁之道》推荐的写法是把结构体的定义与声明放在一起写,因为这样能迅速定位结构体成员的元素;其次,主函数不是一定要写return 0;的,即使不写,程序会自动返回0给操作系统,只有主函数可以这样,写上return 0;只是为了让代码格式统一;最后,由于C语言里,int main()表示对参数形式默认(可以是Void,也可以是int argc, char * argv[]),而且学习面向对象编程语言之后,你会发现对参数默认更好,所以建议还是写int main()。

你的代码应该是:

#include <stdio.h>

struct student
{
    int num;
    char name[3];
    int grade;
} s[2] ={{1001, "zx"}, {1002, "xx"}};

int main()
{
    int i;
    for(i = 0; i < 2; i++)
        if(scanf("%d", &s[i].grade))
            printf("Succeeded.\n");

    return 0;
}

其中,只要读入成功就会打印“Succeeded.”,就不用for循环检查元素了。

本回答被网友采纳
相似回答