You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何将字符串通过数组传递给结构体?

解决C语言中结构体字符数组的初始化与赋值问题

嘿,刚接触C语言遇到这种问题太正常了,我来帮你理清楚怎么正确实现这个createBook函数~

首先咱们得明白:你现在的写法struct book x = { title, author };是行不通的,因为在C语言里,字符数组不能直接用另一个数组名(或者指针)来赋值。当你把数组作为函数参数传递时,数组名会自动退化为指向数组第一个元素的指针,而结构体里的title和author是固定大小的字符数组,没法直接用指针来初始化它们,必须用字符串拷贝的方式来完成赋值。

修正步骤与完整代码

  1. 首先要包含<string.h>头文件,因为我们需要用到字符串拷贝函数strcpy;
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:29:42