C语言结构体类型使用疑问:print_order函数与初始化写法咨询
C语言结构体问题解答
问题1:print_order(the_order)的含义,是否需要为day/month/year额外定义typedef
print_order是你自定义的工具函数,入参为Order类型的结构体变量the_order,作用是将传入订单的所有属性按照预设格式打印输出,属于封装重复逻辑的常规写法,不需要重复编写打印代码,调用一次即可完成订单信息输出。- 不需要给
day/month/year单独定义typedef:你已经将包含这三个int类型成员的结构体统一typedef为Date类型,这三个变量只是Date结构体的成员,本身是基础int类型,已经有明确的类型定义,额外定义属于多余操作。
问题2:orderB的初始化格式是否正确,是否需要和orderA写法保持一致
- 你当前
orderB的初始化格式是合法正确的,不需要和orderA的写法保持一致:- C语言结构体支持两种初始化方式:第一种是
orderA用到的「先声明变量,再逐个给成员赋值」,第二种是orderB用到的「声明时用初始化列表按成员顺序赋值」,两种都是标准语法,按需选择即可,初始化列表的写法代码更简洁,执行效率也更高。 - 注意用初始化列表时必须严格匹配结构体定义的成员顺序:你的
Order结构体成员顺序为customer_name→order_number→order_date→total_price,orderB的初始化顺序完全符合要求,嵌套的Date结构体初始化顺序也匹配Date定义的day→month→year顺序,没有问题。 - 补充:你当前
orderA声明时的初始化{111, 11, 25, 2021, "Rebecca Raspberry"}是错误的,顺序和结构体成员完全不匹配,只是后续你又逐个给成员重新赋值才覆盖了错误的初始化值,没有引发问题,建议删除这行错误的初始化,直接写Order orderA;即可。
- C语言结构体支持两种初始化方式:第一种是
适配目标输出的修改点
你当前代码打印的价格默认会输出6位小数,要得到目标格式的两位小数输出,只需要把所有打印语句里的%f替换为%.2f即可。
修正后可实现目标输出的完整代码
#include <stdio.h> #include <string.h> typedef struct { int day, month, year; } Date; typedef struct { char customer_name[1000]; // 下单客户姓名 int order_number; // 订单号 Date order_date; // 下单日期 double total_price; } Order; /* print_order(the_order) 传入一个Order类型变量,按指定格式打印订单详情 */ void print_order(Order the_order){ printf("Order %d: Placed by %s on %d/%d/%d (price: $%.2f)\n", the_order.order_number, the_order.customer_name, the_order.order_date.month, the_order.order_date.day, the_order.order_date.year, the_order.total_price); } int main(){ // 初始化orderA:逐个成员赋值写法 Order orderA; strcpy(orderA.customer_name, "Rebecca Raspberry"); orderA.order_number = 111; orderA.order_date.year = 2021; orderA.order_date.month = 11; orderA.order_date.day = 25; orderA.total_price = 6.10; // 初始化orderB:初始化列表写法 Order orderB = {"Fiona Framboise", 116, {29, 11, 2021}, 17.0}; print_order(orderA); print_order(orderB); return 0; }
内容的提问来源于stack exchange,提问作者kimmerly2006
相关产品推荐
相关产品推荐

