c语言结构体数组赋值,结构体赋值给数组
c语言结构体数组赋值,结构体赋值给数组详细介绍
本文目录一览: C语言,结构体中的数组怎么赋值,?
intmain(void){
structstudentsbao={};
printf("%d,%s\n",bao.id,bao.name);//输出是4224528,空(应该是null)
//structstudentsbao={3,"123"};可以。第一种赋值方法
//strcpy(bao.name,"bao");//可以,
//printf("%d,%s\n",bao.id,bao.name);
//bao.name="bao";错误“stray'\351'inprogram”其他是乱码,
//bao.name[0]='a';
//bao.name[0]='/0';
//printf("%d,%s\n",bao.id,bao.name);
/*这样可以,*/
//chararr[10]="baobao";
////bao.name=arr;//error"assignmenttoexpressionwitharraytype"
//scanf("%s",bao.name);//可以,
//printf("%d,%s\n",bao.id,bao.name);
//所以scanf那一类函数都可以。
//还有就是memcpy函数也是可以的
return0;
}
扩展资料
C语言结构体数组的直接赋值及数组的长度计算:
#include
//自定义一个字符串的结构体,包含字符串和字符串长度两个变量
typedefstructStr{
charch[100];
intlength;//char数组(字符串)的长度
}myStr;
//刚开始声明变量时每个变量的字符串长度length都为0
//这里以长度为10的数组为例,数组长度是1000
//对第0个到第9个结构体数组的长度同时赋值为0
myStrmyStr1[10]={
[0...9]={
.length=0,
}
};
intmain(){
inti;
for(i=0;i<10;i++){
printf("%d\n",myStr1[i].length);
}
return0;
}
(1)用字符常量逐个初始化数组。例如:
char a[8]={'i','l','o','v','e','y','o','u'};
把8个字符依次分别赋给c[0]~c[7]这8个元素。
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'\0')。
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
例如:char c[]={‘c’,‘’,‘p’,‘r’,‘o','g','r','a','m'};
这时c数组的长度自动定为9。也可以定义和初始化一个二维字符数组,例如:
char diamond[5][5]={{'','','#'},{'','#','','#'},{'#','','','','#'},
{'','#','','#'},{'','','#'}};用它代表一个菱形的平面图形。
(2)字符串常量初始化数组。例如:
char c[]={‘c’,‘’,‘p’,‘r’,‘o','g','r','a','m'};
可写为:char c[]={"C program"};
或去掉{}写为:char c[]="C program";
注意:此时数组c的长度不是9,而是10。因为字符串常量的最后由系统加上一个'\0'。上面的初始化与下面的初始化等价。
char c[]={‘c’,‘’,‘p’,‘r’,‘o','g','r','a','m','\0'};
扩展资料:其定义的一般形式是:char数组名[数据长度]
例如:
char c[10];
c[0]='I';c[1]='';c[2]='l';c[3]='o';c[4]='v';c[5]='e';c[6]='';c[7]='y';c[8]='o';c[9]='u';
以上定义了c为字符数组,包含10个元素。
由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据,例如:
int c[10];
但这时每个数组元素占2个字节的内存单元,浪费存储空间。
字符数组也可以是二维或多维数组,例如:
char c[5][10];
即为二维字符数组。
初始化
字符数组的初始化与数值型数组初始化没有本质区别。但它除了可以逐个给数组元素赋予字符外,也可以直接用字符串对其初始化。
输入输出
字符数组的输入
(1)用getchar()或scanf()的'%c'格式符对数组进行字符赋值。例如,对于数组a[10]:用getchar()赋值:
for(i=0;i<10;i++)
a
=getchar();
用scanf()赋值:
for(i=0;i<10;i++)
scanf("%c",&a);
(2)用scanf()的'%s'格式对数组赋值。还是对于数组a[10]:
scanf("%s",a);
或
scanf("%s“,&a[0]);
输入”C program“并回车时,a数组会自动包含一个以”\0“结尾的字符串”C program“。
字符数组的输出
(1)用putchar()或printf()的‘%c’格式符对数组进行字符赋值。例如,对于数组a[10]:用putchar()赋值:
for(i=0;i<10;i++)
a=putchar();
用printf()赋值:
for(i=0;i<10;i++)
printf("%c",a);
输出结果为:
c program
(2)用printf()的'%s'格式对数组赋值。还是对于数组a[10];
printf("%s",a);
输出结果为:
c program
参考资料:
百度百科——字符数组
1、首先打开vs2010软件,新建一个项目,如图所示。
2、里面包含头文件,如图所示。
3、然后输入入口函数main。
4、接着定义一个结构体,声明结构体变量,如图所示。
5、然后给结构体里面的成员变量赋值。
6、最后打印结构体成员,输出结果就完成了。
你程序中的那种赋值方式只能在数组定义的时候赋值,定义完成后,就要一个一个的赋值。比如:s.a[0] = 1;s.a[1] = 2;如果赋值有一定规律的话,可以用for循环;如果赋的值一样的话,可以用 memset(s.a,0,sizeof(s.a));,memset一般用于数组初始化和清零。
对于已经定义好了的数组,肯定不能用这样赋值啦,给结构体赋值其实就跟其他的变量赋值一样,难道你可以
int a[3];
a={0,1,2};
这个给一个int数组赋值吗,不行啊。
正确的做法就是像其他变量一样一个一个赋值,当然也可在结构体初始化时赋值
intmain(void){
structstudentsbao={};
printf("%d,%s\n",bao.id,bao.name);//输出是4224528,空(应该是null)
//structstudentsbao={3,"123"};可以。第一种赋值方法
//strcpy(bao.name,"bao");//可以,
//printf("%d,%s\n",bao.id,bao.name);
//bao.name="bao";错误“stray'\351'inprogram”其他是乱码,
//bao.name[0]='a';
//bao.name[0]='/0';
//printf("%d,%s\n",bao.id,bao.name);
/*这样可以,*/
//chararr[10]="baobao";
////bao.name=arr;//error"assignmenttoexpressionwitharraytype"
//scanf("%s",bao.name);//可以,
//printf("%d,%s\n",bao.id,bao.name);
//所以scanf那一类函数都可以。
//还有就是memcpy函数也是可以
return0;}
扩展资料:
选择结构:
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用选择结构。选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。
选择结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的选择语句。选择结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序。
这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
参考资料来源:百度百科-c语言
C语言,结构体中的数组怎么赋值,?
你程序中的那种赋值方式只能在数组定义的时候赋值,定义完成后,就要一个一个的赋值。比如:s.a[0]
=
1;s.a[1]
=
2;如果赋值有一定规律的话,可以用for循环;如果赋的值一样的话,可以用
memset(s.a,0,sizeof(s.a));,memset一般用于数组初始化和清零。
对于已经定义好了的数组,肯定不能用这样赋值啦,给结构体赋值其实就跟其他的变量赋值一样,难道你可以
int
a[3];
a={0,1,2};
这个给一个int数组赋值吗,不行啊。
正确的做法就是像其他变量一样一个一个赋值,当然也可在结构体初始化时赋值
如果没记错的话只能是数组初始定义的时候才可以这样赋值。
只能一个一个赋值,s.a[0]=1;
这样是合法的
想给数组赋值的话用循环吧
(1)用字符常量逐个初始化数组。例如:
char a[8]={'i','l','o','v','e','y','o','u'};
把8个字符依次分别赋给c[0]~c[7]这8个元素。
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'\0')。
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
例如:char c[]={‘c’,‘’,‘p’,‘r’,‘o','g','r','a','m'};
这时c数组的长度自动定为9。也可以定义和初始化一个二维字符数组,例如:
char diamond[5][5]={{'','','#'},{'','#','','#'},{'#','','','','#'},
{'','#','','#'},{'','','#'}};用它代表一个菱形的平面图形。
(2)字符串常量初始化数组。例如:
char c[]={‘c’,‘’,‘p’,‘r’,‘o','g','r','a','m'};
可写为:char c[]={"C program"};
或去掉{}写为:char c[]="C program";
注意:此时数组c的长度不是9,而是10。因为字符串常量的最后由系统加上一个'\0'。上面的初始化与下面的初始化等价。
char c[]={‘c’,‘’,‘p’,‘r’,‘o','g','r','a','m','\0'};
扩展资料:其定义的一般形式是:char数组名[数据长度]
例如:
char c[10];
c[0]='I';c[1]='';c[2]='l';c[3]='o';c[4]='v';c[5]='e';c[6]='';c[7]='y';c[8]='o';c[9]='u';
以上定义了c为字符数组,包含10个元素。
由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据,例如:
int c[10];
但这时每个数组元素占2个字节的内存单元,浪费存储空间。
字符数组也可以是二维或多维数组,例如:
char c[5][10];
即为二维字符数组。
初始化
字符数组的初始化与数值型数组初始化没有本质区别。但它除了可以逐个给数组元素赋予字符外,也可以直接用字符串对其初始化。
输入输出
字符数组的输入
(1)用getchar()或scanf()的'%c'格式符对数组进行字符赋值。例如,对于数组a[10]:用getchar()赋值:
for(i=0;i<10;i++)
a=getchar();
用scanf()赋值:
for(i=0;i<10;i++)
scanf("%c",&a);
(2)用scanf()的'%s'格式对数组赋值。还是对于数组a[10]:
scanf("%s",a);
或
scanf("%s“,&a[0]);
输入”C program“并回车时,a数组会自动包含一个以”\0“结尾的字符串”C program“。
字符数组的输出
(1)用putchar()或printf()的‘%c’格式符对数组进行字符赋值。例如,对于数组a[10]:用putchar()赋值:
for(i=0;i<10;i++)
a=putchar();
用printf()赋值:
for(i=0;i<10;i++)
printf("%c",a);
输出结果为:
c program
(2)用printf()的'%s'格式对数组赋值。还是对于数组a[10];
printf("%s",a);
输出结果为:
c program
参考资料:
百度百科——字符数组
结构体二维数组的赋值与定义
结构体二维数组的赋值可对结构体变量的成员逐个赋值,这种方式和数组相像,数组就是逐个元素逐一赋值,不同于数组,标准C中结构体变量可以整体赋值。结构体二维数组是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构,在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类,结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构,结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。
C语言中怎么给一个结构体用scanf进行赋值?
结构体数组指针作为函数参数,通过数组的首地址与偏移量对结构体数组进行scanf的赋值,在函数中通过指针间接访问到其指向的内存。
举例:编写函数,输入5个学号(int),5个姓名(字符串),5个成绩数组(每组三个成绩)(int[3]),依次调用函数
#include
#include
struct student //建立结构体,学号,姓名,3门课的分数
{
int num;
char name[10];
int score[3];
}Stu[5]; //初始化,一共5个学生的数据
void getScore(struct student * p) //函数:向结构体读取分数,一共三门课
{
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 3; j++)
scanf_s("%d", (&(p+i)->score[j]));
}
void getNum(struct student * p) //函数:向结构体读取学号
{
int i;
for (i = 0; i < 5;i++)
scanf_s("%d", &(p + i)->num);
}
void getName(struct student * p) //函数:向结构体读取姓名
{
int i;
for (i = 0; i < 5; i++)
scanf("%s", &(p + i)->name);
}
int main()
{
int i, j, average[3] = { 0 }; //average数组储存每门课的平均分
getNum(Stu); //函数调用
getName(Stu);
getScore(Stu);
for (j = 0; j < 3; j++)
{
for (i = 0; i < 5; i++)
average[j] += Stu[i].score[j];
}
for (i = 0; i < 5; i++)
{
printf("num = %d name = %s Score:", Stu[i].num, Stu[i].name); //依次打印学号 姓名
//printf("%d %d %d", Stu[0].score[0],Stu[0].score[1],Stu[0].score[2]);
for (j = 0; j < 3; j++) //打印三门课的分数
printf(" %d", Stu[i].score[j]);
printf("\n");
}
printf("average:");
for (i = 0; i < 3; i++)
printf("%f ", (float)average[i]/5); //打印三门课平均分
printf("\n");
system("pause");
return 0;
}
如:
scanf("%c%c%c",&a,&b,&c);
输入为:
d e f
则把'd'赋予a, ' '(空格)赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。
只有当输入为:def(字符间无空格) 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
扩展资料:1、函数原型
int scanf(const char * restrict format,...);
函数 scanf() 是从标准输入流stdin [1] (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。
2、返回值
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。如:
scanf("%d %d",&a,&b);函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。
例:使用scanf函数输入数据。
#include
int main(void)
{
int a,b,c;
printf("Give me the value of a,b,c seperated with whitespaces:\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
注意:&a,&b,&c中的&是寻址操作符,&a表示对象a在内存中的地址,是一个右值。变量a,b,c的地址是在编译阶段分配的(存储顺序由编译器决定)。
如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。
参考资料:
百度百科——scanf(计算机语言函数)
c语言结构体能否整体赋值
可以是可以,但它有一个条件,这里的赋初值不是想别的数据类型(如 int a;a=5;)它必须是对结构体中的每个成员以此赋值的,你可以从楼上所写的例子看出这一点。
将一个结构体变量的值直接赋给另外一个结构体变量的时候,这两个结构体必须是相同结构体名。
可以的:
#include "stdio.h"
struct date
{
int i;
float x;
} d1={10,12.5};
void main()
{
struct date d2;
d2=d1;
printf("%d, %f\n",d2.i,d2.x);
}
相同类型的结构体是可以直接赋值的,这是ansi/iso
c规定的。ansi/iso
c规定的合法行为,编译器是必须支持的。
但不能进行比较,例如
if
(stu[1]
==
stu[2])是不允许的。
这种问题不能靠试验获得准确的答案,因为你用的编译器支持并不表明其他编译器也支持。
可以的,但需要保证是具有相同结构的结构体变量。
可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。如student1和student2都是student类型的变量,可以这样赋值:student1= student2;
假设申明了两个成员列表完全一样的两个结构体,编译器会当作两个完全不同的类型,即使他们的成员列表是一样的,令两个结构体的变量间赋值,则是非法的。
扩展资料:
结构体的相关操作规则:
1、可以引用一个结构体变量中的一个成员的值:
例如, student1.num表示结构体变量student1中的成员的值,student1.num的值为10001。引用结构体变量中成员的一般方式为:结构体变量名.成员名。例如可以这样对变量的成员赋值:student1.num=10010;
2、不能将一个结构体变量作为一个整体进行输入和输出:
例如,已定义student1和student2为结构体变量,并且它们已有值。不能企图这样输出结构体变量中的各成员的值:cin>>student1; 只能对结构体变量中的各个成员分别进行输入和输出。
参考资料来源:百度百科-结构体
参考资料来源:百度百科-结构体类型
C语言中怎么给数组赋初值
int a[5]={1,2,3,4};char b[]="abcdefg";数组定义时可以直接赋值初始化。
如果在定义之后,要么通过循环语句一个一个赋值,要么使用内存操作函数统一初始化。
可以使用循环语句,也可以使用memset()函数
数组赋值可以通过以下几种方法:
1、定义的时候直接赋初值(用{});
2、用循环语句依次给数组各元素赋值;
3、将数组放在一个结构体里面,通过结构体的引用给数组整体赋值;(数组本身不能直接整体赋值)
c语言中 结构体中有二维数组怎样赋初值
最基本的方法就是:
mx[0].name[0] = x;
mx[0].information[0][0] = x;
以此类推 ……
数组不能整体直接赋值,以下情况除外:
1. 初始化时赋值:
typedef struct star
{
char name[8];
char information[2][2];
}MX;
MX mx[2] = {{"zhang",
{{'a','a'},
{'b','b'}}},//为了你能看清楚mx[0]分了三行,此处之前是mx[0],下面是mx[1]
{"lisi", {{'c','c'},{'d','d'}}}};
2. 把数组放在结构里,两个结构可以直接赋值。
3. memcpy等方法。
需要注意几点,
你的name是个字节,所以如果name的大括号里用“zhangsan”,会踩内存,初学者常犯的错误,因为这种赋值隐含了"\0",字符串的截止符,换句话说你赋值zhangsan是8个BYTE+“\0”,这样就超过name[8]了。
你可以尝试指针×pName;
希望对你有所帮助。
struct star
{
char name[8];
char information[2][2];
}mx={
"zhangsan",'a','b','c','d',
}
struct star
{
char name[8];
char information[2][2];
}
mx={ "abcdefg",{{'a','b'},{'c','d'}}};
{
{"aa", {{'a','a'},{'b','d'}},
最基本的方法就是:
mx[0].name[0] = x;
mx[0].information[0][0] = x;
以此类推 ……
数组不能整体直接赋值,以下情况除外:
1. 初始化时赋值:
typedef struct star
{
char name[8];
char information[2][2];
}MX;
MX mx[2] = {{"zhang",
{{'a','a'},
{'b','b'}}},//为了你能看清楚mx[0]分了三行,此处之前是mx[0],下面是mx[1]
{"lisi", {{'c','c'},{'d','d'}}}};
2. 把数组放在结构里,两个结构可以直接赋值。
3. memcpy等方法。
需要注意几点,
你的name是个字节,所以如果name的大括号里用“zhangsan”,会踩内存,初学者常犯的错误,因为这种赋值隐含了"\0",字符串的截止符,换句话说你赋值zhangsan是8个BYTE+“\0”,这样就超过name[8]了。
你可以尝试指针×pName;
结构体赋值给数组
对于已经定义好了的数组,肯定不能用这样赋值啦,给结构体赋值其实就跟其他的变量赋值一样,难道你可以
int
a[3];
a={0,1,2};
这个给一个int数组赋值吗,不行啊。
正确的做法就是像其他变量一样一个一个赋值,当然也可在结构体初始化时赋值
c语言只有在定义字符数组的时候才能用“=”来初始化变量,其它情况下是不能直接用“=”来为字符数组赋值的,要为字符数组赋值可以用string.h头文件中的strcpy函数来完成。
例如:
char
a[10]
=
"123";
/*正确,在定义的时候初始化*/
char
a[10];
a
=
"123";
/*错误,不能用“=”直接为字符数组赋值*/
strcpy(a,
"123");
/*正确,使用strcpy函数复制字符串*/
所以要对game[0][0].cpart赋值应该用strcpy(game[0][0].cpart,
"123");才对。注意要使用strcpy函数要用#include
包含string.h头文件。
C语言中结构体中的数组,不能直接赋值吗?
因为数组名就是数组第一个元素的指针常量,是一个常量左值。可以赋值的必须是非常量左值,常量左值和右值是不可以被赋值的。 以上是我个人的理解,有疑问继续追问。