C语言中如何将字符串通过数组传递给结构体?
解决C语言中结构体字符数组的初始化与赋值问题
嘿,刚接触C语言遇到这种问题太正常了,我来帮你理清楚怎么正确实现这个createBook函数~
首先咱们得明白:你现在的写法struct book x = { title, author };是行不通的,因为在C语言里,字符数组不能直接用另一个数组名(或者指针)来赋值。当你把数组作为函数参数传递时,数组名会自动退化为指向数组第一个元素的指针,而结构体里的title和author是固定大小的字符数组,没法直接用指针来初始化它们,必须用字符串拷贝的方式来完成赋值。
修正步骤与完整代码
- 首先要包含
<string.h>头文件,因为我们需要用到字符串拷贝函数strcpy; - 在
createBook函数里,先创建一个结构体变量,然后用strcpy把参数里的字符串内容拷贝到结构体的对应数组中。
修正后的完整代码如下:
#include <stdio.h> #include <string.h> // 必须包含这个头文件来使用strcpy struct book { char title[50]; char author[50]; }; struct book createBook(char title[50], char author[50]) { struct book x; // 使用strcpy把参数中的字符串拷贝到结构体的字符数组里 strcpy(x.title, title); strcpy(x.author, author); return x; } // 测试用的main函数 int main() { struct book myBook = createBook("The Great Gatsby", "F. Scott Fitzgerald"); printf("书名:%s\n作者:%s\n", myBook.title, myBook.author); return 0; }
为什么原来的写法不行?
简单来说:
- 当你把
char title[50]作为函数参数时,它实际上等价于char *title(数组退化为指针); - 结构体里的
char title[50]是一块固定大小的内存空间,你不能直接把指针赋值给它——这就像你不能把一个地址直接当成一整串字符来用,必须把地址指向的内容复制到这块内存里,strcpy就是干这个活的,它会逐个字符把源字符串的内容复制到目标数组中,直到遇到字符串结束符\0。
额外小提示
如果是用字符串字面量直接初始化结构体(不是通过函数参数传递),你可以这样写:
struct book x = {"1984", "George Orwell"};
这种写法是合法的,因为编译器会自动把字面量的内容复制到结构体的数组里,但这种方式只适用于结构体定义时的初始化,没法在函数里用参数来这么做哦。
内容的提问来源于stack exchange,提问作者Aidan Shilling
相关产品推荐
相关产品推荐

