july4_97.c

 
#include <stdio.h> #include <time.h> #include <string.h> #include "aip_common.h" int main() { time_t u4_t_time_now =time (NULL); ST tm st_t_time_members; // 改为栈分配的结构体 localtime_s(&st_t_time_members, &u4_t_time_now); // 使用安全版本 // 中文星期数组 const U1* u1p_tp_cnweeks_members[] = { "日", "一", "二", "三", "四", "五", "六" }; // 英文月份数组 const U1* u1p_tp_enmonths_members[] = { "January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December" }; // 英文星期数组 const U1* u1p_tp_enweeks_members[] = { "Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday" }; // 日文星期数组 const U1* u1p_tp_jpweeks_members[] = { "日", "月", "火", "水", "木", "金", "土" }; // 格式1:2017年9月28日 星期四 14点26分13秒 printf("格式1:%d年%d月%d日 星期%s %d点%d分%d秒\n", st_t_time_members.tm_year + 1900, st_t_time_members.tm_mon + 1, st_t_time_members.tm_mday, u1p_tp_cnweeks_members[st_t_time_members.tm_wday], st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式2:2017/9/28 星期四 14:26:13 printf("格式2:%d/%d/%d 星期%s %d:%02d:%02d\n", st_t_time_members.tm_year + 1900, st_t_time_members.tm_mon + 1, st_t_time_members.tm_mday, u1p_tp_cnweeks_members[st_t_time_members.tm_wday], st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式3:2017/9/28 星期四 2:26:13(PM) int hour12 = st_t_time_members.tm_hour % 12; if (hour12 == 0) { hour12 = 12; } else { // 空语句,不做任何操作 } printf("格式3:%d/%d/%d 星期%s %d:%02d:%02d(%s)\n", st_t_time_members.tm_year + 1900, st_t_time_members.tm_mon + 1, st_t_time_members.tm_mday, u1p_tp_cnweeks_members[st_t_time_members.tm_wday], hour12, st_t_time_members.tm_min, st_t_time_members.tm_sec, (st_t_time_members.tm_hour >= 12) ? "PM" : "AM"); // 格式4:Thursday, September 28, 2017 14:26:13 printf("格式4:%s, %s %d, %d %02d:%02d:%02d\n", u1p_tp_enweeks_members[st_t_time_members.tm_wday], u1p_tp_enmonths_members[st_t_time_members.tm_mon], st_t_time_members.tm_mday, st_t_time_members.tm_year + 1900, st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式5:2017年9月28日(木) 2:26:13(PM) printf("格式5:%d年%d月%d日(%s) %d:%02d:%02d(%s)\n", st_t_time_members.tm_year + 1900, st_t_time_members.tm_mon + 1, st_t_time_members.tm_mday, u1p_tp_jpweeks_members[st_t_time_members.tm_wday], hour12, st_t_time_members.tm_min, st_t_time_members.tm_sec, (st_t_time_members.tm_hour >= 12) ? "PM" : "AM"); return 0; } 将该代码中的三元判断语句改为ifelse语句
08-06
#include <stdio.h> #include <time.h> #include <string.h> #include "aip_common.h" #define ZERO (0) #define DEFAULT_YEAR (1900) #define DEFAULT_MON (1) #define HALFDAY (12) U4 main() { time_t u4_t_time_now = time(NULL); struct tm st_t_time_members; localtime_s(&st_t_time_members, &u4_t_time_now); // 中文星期数组 const U1* u1p_tp_cnweeks_members[] = { "日", "一", "二", "三", "四", "五", "六" }; // 英文月份数组 const U1* u1p_tp_enmonths_members[] = { "January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December" }; // 英文星期数组 const U1* u1p_tp_enweeks_members[] = { "Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday" }; // 日文星期数组 const U1* u1p_tp_jpweeks_members[] = { "日", "月", "火", "水", "木", "金", "土" }; // 格式1:2017年9月28日 星期四 14点26分13秒 printf("格式1:%d年%d月%d日 星期%s %d点%d分%d秒\n",st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_mon + (U4)DEFAULT_MON, st_t_time_members.tm_mday,u1p_tp_cnweeks_members[st_t_time_members.tm_wday], st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式2:2017/9/28 星期四 14:26:13 printf("格式2:%d/%d/%d 星期%s %d:%02d:%02d\n",st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_mon + (U4)DEFAULT_MON, st_t_time_members.tm_mday,u1p_tp_cnweeks_members[st_t_time_members.tm_wday], st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式3:2017/9/28 星期四 2:26:13(PM) U4 u4_t_time_halfday = st_t_time_members.tm_hour % (U4)HALFDAY; if ( (U4)ZERO == u4_t_time_halfday) { u4_t_time_halfday = (U4)HALFDAY; } else { } const U1* ampm_str; if ((U4)HALFDAY <= st_t_time_members.tm_hour) { ampm_str = "PM"; } else { ampm_str = "AM"; } printf("格式3:%d/%d/%d 星期%s %d:%02d:%02d(%s)\n",st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_mon + (U4)DEFAULT_MON, st_t_time_members.tm_mday,u1p_tp_cnweeks_members[st_t_time_members.tm_wday], u4_t_time_halfday, st_t_time_members.tm_min, st_t_time_members.tm_sec,ampm_str); // 格式4:Thursday, September 28, 2017 14:26:13 printf("格式4:%s, %s %d, %d %02d:%02d:%02d\n",u1p_tp_enweeks_members[st_t_time_members.tm_wday],u1p_tp_enmonths_members[st_t_time_members.tm_mon], st_t_time_members.tm_mday, st_t_time_members.tm_year + (U4)DEFAULT_YEAR,st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式5:2017年9月28日(木) 2:26:13(PM) if ((U4)HALFDAY <= st_t_time_members.tm_hour) { ampm_str = "PM"; } else { ampm_str = "AM"; } printf("格式5:%d年%d月%d日(%s) %d:%02d:%02d(%s)\n",st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_mon + (U4)DEFAULT_MON, st_t_time_members.tm_mday, u1p_tp_jpweeks_members[st_t_time_members.tm_wday], u4_t_time_halfday, st_t_time_members.tm_min, st_t_time_members.tm_sec,ampm_str); return ZERO; } 给数组加上初始化函数
08-06
<think>我们注意到代码中定义了多个数组(星期和月份),并且这些数组是全局常量。但是,根据要求,我们需要为这些数组加上初始化函数。然而,这些数组是常量,通常不需要在运行时初始化。但如果我们理解“初始化函数”为将这些数组的初始化封装到一个函数中,那么我们可以创建一个初始化函数来设置这些数组,然后返回它们(或者通过指针参数填充)。但是,由于这些数组是常量,且在整个程序中不变,更常见的做法是保持原样。不过,如果题目要求必须使用函数来初始化,我们可以考虑以下方式: 由于这些数组是只读的,且大小固定,我们可以通过函数返回指向数组的指针。但是,注意数组类型是`const U1* []`,即指向字符串常量的指针数组。 但是,原代码中这些数组是在main函数内部定义的,现在要求加上初始化函数,我们可以将数组的初始化移到函数中,然后在main函数中调用这些函数来获取数组。 然而,这里有一个问题:如果我们在函数内部定义静态数组,然后返回它,这样可以避免在栈上分配大数组(但实际上这些数组很小),同时保证生命周期。但注意,这些数组的内容是常量字符串,所以可以这样做。 修改计划: 1. 为每种数组(中文星期、英文月份、英文星期、日文星期)编写一个初始化函数,返回`const U1**`(即指向字符串常量指针数组的指针)。 2. 在main函数中,调用这些初始化函数来获取数组指针。 但是,注意原数组是数组类型,而函数返回的是指针,实际上数组名在表达式中就是指针,所以可以这样使用。 但是,由于这些数组是只读的,并且在整个程序运行期间不变,我们可以使用静态局部变量,在函数中返回它们的地址。 例如: const U1** get_cn_weeks() { static const U1* arr[] = { "日", "一", "二", "三", "四", "五", "六" }; return arr; } 但是,这样返回的是指向数组第一个元素的指针,而数组类型是`const U1*[7]`,返回类型是`const U1**`,它们是兼容的。 然而,我们也可以使用typedef来简化: typedef const U1* WeekArray[7]; WeekArray* get_cn_weeks() { static WeekArray arr = { "日", "一", "二", "三", "四", "五", "六" }; return &arr; } 但是这样使用起来需要解引用,比较麻烦。所以还是返回指向首元素的指针更简单。 另外,注意原代码中数组是7个元素(星期)或12个元素(月份),所以我们需要在函数中初始化对应大小的数组。 但是,由于题目没有明确要求,我们选择简单的方式:返回指向数组首元素的指针。 修改步骤: 1. 定义四个初始化函数: - `const U1** init_cn_weeks()` - `const U1** init_en_months()` - `const U1** init_en_weeks()` - `const U1** init_jp_weeks()` 2. 在main函数中,调用这些函数获取数组指针,并赋值给对应的指针变量(原数组变量名)。 但是,注意原代码中数组变量名是`u1p_tp_cnweeks_members`等,现在我们将它们替换为函数调用返回的指针。 3. 注意:使用这些指针时,和原数组用法一样(因为数组名在表达式中就是指向首元素的指针)。 但是,原代码中数组的大小是固定的(星期7个,月份12个),所以我们在函数中返回的数组大小也是固定的,因此不会越界。 4. 由于这些函数返回的是静态数组的地址,所以是线程不安全的,但在单线程程序中没问题。 另外,注意原代码中月份数组有12个月,星期数组有7天。 我们按照这个思路修改代码。 但是,原代码中数组是定义在main内部的局部变量,现在改为调用函数,这些函数可以定义在main函数之前。 由于代码中使用了自定义类型`U1`和`U4`,我们假设这些在"aip_common.h"中定义(通常是unsigned char和unsigned int)。 修改后的代码: 注意:由于原代码中数组是直接定义的,现在改为函数,我们需要修改数组的获取方式。 例如,原: const U1* u1p_tp_cnweeks_members[] = { ... }; 改为: const U1** u1p_tp_cnweeks_members = init_cn_weeks(); 但是,这样改完后,u1p_tp_cnweeks_members的类型是指针,而原数组下标访问是相同的,所以可以。 但是,注意原数组是数组类型(数组的数组),而现在是二级指针,实际上在访问元素时,都是通过指针偏移,所以语法相同。 但是,有一个区别:原数组变量名是数组类型,而现在是二级指针,但是当使用`u1p_tp_cnweeks_members[i]`时,对于数组类型和指针类型都是合法的。 因此,我们按照这个思路修改。 另外,由于原代码中数组是常量,我们在函数中返回的也是指向常量的指针,所以不会修改,是安全的。 下面给出修改后的代码。 注意:由于原代码中使用了`localtime_s`,这是Windows平台的安全函数,在Linux上可能不可用,但这里我们只关注数组初始化部分。 另外,原代码中有一个空else语句,我们保留。 代码修改如下:</think>以下是将数组初始化封装为函数的修改版本: ```c #include <stdio.h> #include <time.h> #include <string.h> #include "aip_common.h" #define ZERO (0) #define DEFAULT_YEAR (1900) #define DEFAULT_MON (1) #define HALFDAY (12) // 初始化中文星期数组 const U1** init_cn_weeks() { static const U1* cn_weeks[] = { "日", "一", "二", "三", "四", "五", "六" }; return cn_weeks; } // 初始化英文月份数组 const U1** init_en_months() { static const U1* en_months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; return en_months; } // 初始化英文星期数组 const U1** init_en_weeks() { static const U1* en_weeks[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; return en_weeks; } // 初始化日文星期数组 const U1** init_jp_weeks() { static const U1* jp_weeks[] = { "日", "月", "火", "水", "木", "金", "土" }; return jp_weeks; } U4 main() { time_t u4_t_time_now = time(NULL); struct tm st_t_time_members; localtime_s(&st_t_time_members, &u4_t_time_now); // 通过初始化函数获取数组 const U1** u1p_tp_cnweeks_members = init_cn_weeks(); const U1** u1p_tp_enmonths_members = init_en_months(); const U1** u1p_tp_enweeks_members = init_en_weeks(); const U1** u1p_tp_jpweeks_members = init_jp_weeks(); // 格式1:2017年9月28日 星期四 14点26分13秒 printf("格式1:%d年%d月%d日 星期%s %d点%d分%d秒\n", st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_mon + (U4)DEFAULT_MON, st_t_time_members.tm_mday, u1p_tp_cnweeks_members[st_t_time_members.tm_wday], st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式2:2017/9/28 星期四 14:26:13 printf("格式2:%d/%d/%d 星期%s %d:%02d:%02d\n", st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_mon + (U4)DEFAULT_MON, st_t_time_members.tm_mday, u1p_tp_cnweeks_members[st_t_time_members.tm_wday], st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式3:2017/9/28 星期四 2:26:13(PM) U4 u4_t_time_halfday = st_t_time_members.tm_hour % (U4)HALFDAY; if ((U4)ZERO == u4_t_time_halfday) { u4_t_time_halfday = (U4)HALFDAY; } else { // 空语句 } const U1* ampm_str; if ((U4)HALFDAY <= st_t_time_members.tm_hour) { ampm_str = "PM"; } else { ampm_str = "AM"; } printf("格式3:%d/%d/%d 星期%s %d:%02d:%02d(%s)\n", st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_mon + (U4)DEFAULT_MON, st_t_time_members.tm_mday, u1p_tp_cnweeks_members[st_t_time_members.tm_wday], u4_t_time_halfday, st_t_time_members.tm_min, st_t_time_members.tm_sec, ampm_str); // 格式4:Thursday, September 28, 2017 14:26:13 printf("格式4:%s, %s %d, %d %02d:%02d:%02d\n", u1p_tp_enweeks_members[st_t_time_members.tm_wday], u1p_tp_enmonths_members[st_t_time_members.tm_mon], st_t_time_members.tm_mday, st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_hour, st_t_time_members.tm_min, st_t_time_members.tm_sec); // 格式5:2017年9月28日(木) 2:26:13(PM) if ((U4)HALFDAY <= st_t_time_members.tm_hour) { ampm_str = "PM"; } else { ampm_str = "AM"; } printf("格式5:%d年%d月%d日(%s) %d:%02d:%02d(%s)\n", st_t_time_members.tm_year + (U4)DEFAULT_YEAR, st_t_time_members.tm_mon + (U4)DEFAULT_MON, st_t_time_members.tm_mday, u1p_tp_jpweeks_members[st_t_time_members.tm_wday], u4_t_time_halfday, st_t_time_members.tm_min, st_t_time_members.tm_sec, ampm_str); return ZERO; } ``` ### 主要修改说明: 1. **数组初始化函数**: - 为每个语言数组创建专门的初始化函数(`init_cn_weeks`, `init_en_months`等) - 使用`static`关键字确保数组生命周期持续整个程序运行期 - 函数返回指向字符串指针数组的指针(`const U1**`) 2. **主函数优化**: - 在`main()`中调用初始化函数获取数组指针 - 保持原有格式化输出逻辑不变 - 保留原有的12小时制转换和AM/PM判断逻辑 3. **代码结构改进**: - 将数组定义与使用分离,提高模块化程度 - 增强代码可读性和可维护性 - 便于未来扩展多语言支持 4. **内存管理**: - 使用静态数组避免重复初始化 - 确保内存安全,无动态分配操作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值