迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

在 C 语言中初始化结构体数组

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将演示关于如何在 C 语言中初始化一个结构体数组的多种方法。


在 C 语言中使用列表符号初始化结构体数组

结构是派生数据类型,通常由多个成员组成。注意,struct 定义中的成员声明顺序很重要,当使用初始化器列表时,它也遵循同样的顺序。在下面的例子中,我们定义了一个名为 Personstruct,它包括 2 个 char 数组,一个 int 和一个 bool。因此,我们声明一个 Person 结构的数组,并用大括号列表初始化它,就像初始化单一数据类型数组一样。然后我们使用 for 循环输出初始化的数组元素。不过要注意的是,由于我们在初始化列表的每个字符串字面中都包含了 0 字节,所以 char 数组会以%s 格式指定符打印出来。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef struct Person{
    char firstname[40];
    char lastname[40];
    int age;
    bool alive;
} Person;

int printPerson(Person *p)
{
    if (p == NULL)
        return -1;

    printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ",
           p->firstname, p->lastname, p->age);
    p->alive ? printf("Yes\n") : printf("No\n");

    return 0;
}

int main(void) {

    Person arr[] = {
            { "John\0","McCarthy\0", 24, 1},
            { "John\0","Kain\0", 27, 1},
    };

    size_t size = sizeof arr / sizeof arr[0];
    for (int i = 0; i < size; ++i) {
        printPerson(&arr[i]);
        printf("\n");
    }

    exit(EXIT_SUCCESS);
}

输出:

Name: John
Last Name: McCarthy
Age: 24
Alive: Yes

Name: John
Last Name: Kain
Age: 27
Alive: Yes

使用一个单独的函数和循环来初始化 C 语言中的结构体数组

前一种方法的缺点是数组可以用硬编码的值来初始化,或者说需要的数组越大,初始化语句就越大。因此,我们应该实现一个单一的 struct 元素初始化函数,从迭代中调用它来做 struct 数组。需要注意的是,initPerson 函数将所有 struct 成员值作为参数,并将其赋值给同样被传递为参数的 Person 对象。最后,我们使用 printPerson 函数将数组的每个元素输出到控制台。请注意,我们将相同的 Person 值传递给初始化函数只是为了演示。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef struct Person{
    char firstname[40];
    char lastname[40];
    int age;
    bool alive;
} Person;

int printPerson(Person *p)
{
    if (p == NULL)
        return -1;

    printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ",
           p->firstname, p->lastname, p->age);
    p->alive ? printf("Yes\n") : printf("No\n");

    return 0;
}

int initPerson(Person *p, char *fn, char *ln, int age, bool alive)
{
    if (p == NULL)
        return -1;

    memmove(&p->firstname, fn, strlen(fn)+1);
    memmove(&p->lastname, ln, strlen(ln)+1);
    p->age = age;
    p->alive = alive;

    return 0;
}

enum {LENGTH = 10};

int main(void) {
    Person me = { "John\0", "McCarthy\0", 24, 1};
    Person arr[LENGTH];

    for (int i = 0; i < LENGTH; ++i) {
        initPerson(&arr[i], me.firstname, me.lastname, me.age, me.alive);
    }

    for (int i = 0; i < LENGTH; ++i) {
        printPerson(&arr[i]);
        printf("\n");
    }

    exit(EXIT_SUCCESS);
}

输出:

Name: John
Last Name: McCarthy
Age: 24
Alive: Yes

Name: John
Last Name: Kain
Age: 27
Alive: Yes

...

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便