如何对结构体中的字符串进行赋值
对结构体中的字符串赋值,不能直接使用结构体名.结构体成员
作为左值,需要借助C语言标准库中的strycpy方法。
- 错误赋值格式:
结构体名.结构体成员 = 字符串
- 正确赋值格式:
strcpy(结构体名.结构体成员, 字符串)
- 案例代码
#include <string.h>
struct Student{
int age;
char name[20];
}
int main()
{
struct Student s1 = {15,"wangwu"};
s1.age = 16; // 1. 结构体基本类型赋值正确语法
s1.name = "wangwu" // 2. 结构体字符串类型赋值错误语法,这是一段错误代码,编译会报错!!!
strcpy(s1.name, "wangwu"); // 3. 结构体字符串类型赋正确语法
printf("年龄:%d,姓名:%s\n",s1.age , s1.name);
struct Student* p1 = &s1;
strcpy(p1->name, "wangwu"); // 4. 通过指针,给结构体字符串类型赋
printf("年龄:%d,姓名:%s\n",p1->age , p1->name);
return;
}
梳理
-
结构体基本类型赋值正确语法:
- 基本数据类型,直接赋值即可。
-
结构体字符串类型赋值错误语法:
- 想一想,
s1.name
指的是结构体s1中的数组name的首地址,地址能接收字符串吗?
- 想一想,
-
结构体字符串类型赋正确语法:
-
strcpy(str2,str1)
是C语言中的标注库函数(需要导入string.h
头文件),会将str1中的值拷贝1份到str2中(包含“\0”)。 -
想一想,为什么一定要用拷贝的方式?因为C语言中,是不能一次对数组中的所有元素进行赋值的,只能通过类似for循环的方式对元素逐个进行赋值,
strcpy(str2,str1)
方法的内部实际就是一个for循环,效果跟如下代码是类似的。void my_srtcpy(char* str2, char* str1) { while(*str1 != '\0') { *str2 = *str1; str2++; str1++; } *str2 = *str1; // 最后将‘\0’拷贝过来 }
-
-
通过指针,给结构体字符串类型赋:
- 方式同梳理3,只不过需要通过
p1->name
或者(*p1).name
先对结构体解引用,拿到结构体中的字符串首地址,在进行拷贝操作。
- 方式同梳理3,只不过需要通过