首页 新闻 会员 周边

C语言结构体数组初始化问题

0
悬赏园豆:30 [已解决问题] 解决于 2020-07-07 21:50

C语言结构体数组指定初始化器时,下面的三种方法,只有第三种可以,但是第一,二种,我看不出语法上哪错了,编译器DEVc++会报错
[Error] C99 designator 'num_insur' outside aggregate initializer
查了不少资料,但还是找不到...
烦请园友帮忙看看
代码如下:

include <stdio.h>

include <stdlib.h>

include <string.h>

define LEN 20

define COUNT 2

define NUM_LEN 10

struct name
{
char Fname[LEN];
char Mname[LEN];
char Lastname[LEN];

};

struct insurrance
{
char num_insur[NUM_LEN];
struct name names;
};

void input1(int count, struct insurrance arr_insur[]);
void input2(int count, struct insurrance *pinsur);

int main(void)
{

struct insurrance arr_insur[COUNT] = 
{
	{
		//第一种:不可以 
		.num_insur = "12345678",
		{"sheng", "M.", "shuai"} 
		
		//第二种不可以 

// .names.Fname = "sheng",
// .names.Mname = "M.",
// .names.Lastname = "shuai"
},
{
.num_insur = "12345678",
.names = {"shi", "T.", "long"}
// .Fname = "shi",
////// .Mname = "",
// .Lastname = "long"
}
};

//第三种可以 

// struct insurrance arr_insur[COUNT];

// strcpy(arr_insur[0].num_insur, "123456789");
// strcpy(arr_insur[0].names.Fname, "sheng");
// strcpy(arr_insur[0].names.Lastname, "shuai");
// strcpy(arr_insur[0].names.Mname, "S");
//
// strcpy(arr_insur[1].num_insur, "123456789");
// strcpy(arr_insur[1].names.Fname, "shi");
// strcpy(arr_insur[1].names.Lastname, "long");
// strcpy(arr_insur[1].names.Mname, "S");

// printf("%s", arr_insur[1].names.Mname);
input1(COUNT, arr_insur);
input2(COUNT, arr_insur);

return 0;

}

void input2(int count, struct insurrance *pinsur)
{
int i;
for(i = 0; i < count; i++)
{
if(strcmp((pinsur+i)->names.Mname, "") > 0)
{
printf("%s,%s %s. -- %s\n", (pinsur+i)->names.Fname, (pinsur+i)->names.Lastname, (pinsur+i)->names.Mname, (pinsur+i)->num_insur);
}else
{
printf("%s,%s -- %s\n", (pinsur+i)->names.Fname, (pinsur+i)->names.Lastname, (pinsur+i)->num_insur);
}
}
}

void input1(int count, struct insurrance arr_insur[])
{
int i;
for(i = 0; i < count; i++)
{
if(strcmp(arr_insur[i].names.Mname, "") > 0)
{
printf("%s,%s %s. -- %s\n", arr_insur[i].names.Fname, arr_insur[i].names.Lastname, arr_insur[i].names.Mname,arr_insur[i].num_insur);
}else
{
printf("%s,%s -- %s\n", arr_insur[i].names.Fname, arr_insur[i].names.Lastname, arr_insur[i].num_insur);
}
}
}

墨梅渐盛的主页 墨梅渐盛 | 初学一级 | 园豆:82
提问于:2020-07-02 15:48
< >
分享
最佳答案
0

这么说吧,字符数组可以在定义的时候直接赋值,如 char arr[100]=“I am monster”;
但是如果在定义之后,再对字符数组进行赋值,用“=”这个赋值运算符已经不行了,例 arr=“god”;此时arr代表字符数组的首地址,arr[0]也是首地址,(严格起来不能说成地址,但是我不管了),arr[0]表示的是一个字符,arr同理,你不能将字符串赋值给一个字符。
在使用scanf的时候,的确可以写成scanf("%s",arr);此时的arr表示地址的意思,把读取到的字符串第一个字符对准arr[0],第二个对准arr[1],这是scanf的一种的解释
所以,在定义之后再对数组进行赋值,只能一个一个字符的赋值,即
arr[0]='a';
arr[1]='p';
arr[2]='p';
arr[3]='l';
arr[4]='e';

而你第三种方法使用了strcpy()函数,这函数实际上也是一个一个字符进行赋值的,只是你使用函数的时候看起来是一整个字符串赋值给了某某;

收获园豆:30
Conan-jine | 小虾三级 |园豆:1272 | 2020-07-02 21:41

谢谢
首先实在抱歉,最近学校期末考,没来得急看这边。
你的解释我懂了,但是第一种,第二种我觉得都是在定义结构数组的时候初始化,没有问题呀。
C Primmar Plus上也有相似的结构数组赋值方式。

墨梅渐盛 | 园豆:82 (初学一级) | 2020-07-07 17:58

@墨梅渐盛: 你这个书本上的意思定义接着初始化,格式正确。


你仔细看看你的和书本的有什么区别,
书本上的是表示这个结构体已经创建成功,并且在主函数里面声明一个funds jones【】数组,并且后面紧接着进行=赋值操作,这个其实就相当于int num=5;
而你的操作多了以下图片这些东西,这就相当于int num={num=5};


Conan-jine | 园豆:1272 (小虾三级) | 2020-07-07 18:47

@Conan-jine:

可是我觉得我只是用了指定初始化器而已。

墨梅渐盛 | 园豆:82 (初学一级) | 2020-07-07 19:03

@墨梅渐盛: 假如你使用正确,你书本上有一个细节,是C99和C11版本,假如编译器支持的版本不是这两个,就意味着会编译报错,你的编译软件是啥,使用的编译版本是啥

Conan-jine | 园豆:1272 (小虾三级) | 2020-07-07 19:36

@Conan-jine: DevC++
是c99的,实在不行,就不纠结了...
谢了

墨梅渐盛 | 园豆:82 (初学一级) | 2020-07-07 20:20

@墨梅渐盛: 我提个建议,因为我没法把你的代码编译,你的代码复制粘贴上来全乱了,你可以在设置里面把默认编辑器给改了,改成tinyMCE,然后它有一个插入代码的功能,以后你提问题复制粘贴不会变形

Conan-jine | 园豆:1272 (小虾三级) | 2020-07-07 23:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册