news 2026/6/18 7:02:21

时间序列五大基本性质:趋势、季节性、平稳性、自相关与异常性的工程化诊断框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
时间序列五大基本性质:趋势、季节性、平稳性、自相关与异常性的工程化诊断框架

1. 这不是“时间序列入门”,而是你真正用得上的底层认知框架

“Fundamental Properties of Time Series Data”——这个标题看起来像教科书章节名,冷、硬、抽象。但如果你正在做销售预测、设备故障预警、用户行为分析、金融风控,甚至只是想把公司后台的每日访问量图表从“好看”变成“能说话”,那它就不是概念,而是你每天调参失败、模型漂移、业务方反复追问“为什么上个月准,这个月全不准”的根源所在。我带过7个工业IoT项目,其中4个在第二季度突然预测准确率暴跌15%以上,最后发现不是算法换错了,而是没人检查过数据本身的平稳性是否被悄悄破坏;也帮电商团队重构过GMV预测 pipeline,把原来黑箱式LSTM直接扔掉,先用3天时间系统跑完“季节性分解+自相关诊断+差分阶数验证”,结果上线后首月异常波动识别响应速度提升2.3倍。这些都不是靠调库函数实现的,而是对“时间序列基本性质”的肌肉记忆式理解。它不教你写代码,但决定你写的每一行代码有没有意义;它不替代模型,但告诉你该用哪个模型、什么时候该停手、哪里藏着致命陷阱。适合三类人:刚学完ARIMA但一上真实数据就懵的新手;能跑通LSTM却解释不清为何要加dropout的中级工程师;以及被业务方逼着“再准一点”的数据负责人——因为所有“再准一点”的空间,都藏在数据自身的结构里,而不是模型的层数里。

2. 为什么必须拆解这五大性质?——避开90%项目翻车的第一道防火墙

很多人把时间序列建模当成“选模型→喂数据→看指标”的流水线,结果模型在训练集上AUC 0.95,上线后一周内报警阈值天天误报。问题往往不出在模型本身,而出在建模前的“性质诊断”环节被跳过。我见过最典型的翻车场景:某物流公司的运单时效预测,团队直接上Prophet,结果发现节假日前后误差爆炸,排查三天才发现原始数据存在未校准的系统性时间偏移(即时间戳记录的是服务器本地时间而非业务发生时间),导致所有“星期几”的模式识别全部错位。这不是模型缺陷,是数据基础性质没摸清。真正决定一个时间序列能否被有效建模的,是五个不可绕过的底层性质,它们构成诊断漏斗,层层过滤风险:

2.1 趋势性(Trend):不是“有无上升/下降”,而是“变化机制是否可持续”

趋势常被简单理解为“整体向上或向下”,但实战中关键在于判断其生成机制。比如某SaaS产品的DAU曲线显示连续12个月增长,表面是强正向趋势,但深入看发现:增长完全由新市场地推活动驱动,而地推预算下季度将砍半。此时若用线性趋势外推,就是灾难。真正的趋势诊断必须回答三个问题:

  • 驱动源是否内生?(如产品功能迭代带来的自然留存提升 vs. 短期补贴拉动)
  • 斜率是否恒定?(用滚动窗口计算局部斜率标准差,>0.3需警惕非线性)
  • 是否存在结构性断点?(用Bai-Perron检验,比肉眼观察可靠10倍)

我处理过一个风电功率预测项目,原始数据趋势平缓,但加入温度协变量后,发现功率趋势实际随温度呈分段线性——低温区功率随风速线性增长,高温区则因叶片结霜出现平台期。忽略这点,所有单变量模型都会在夏季持续高估。趋势性不是画条拟合线,而是给数据“做病理切片”。

2.2 季节性(Seasonality):周期≠固定间隔,关键在“业务语义对齐”

教科书说“季节性是固定周期重复模式”,但真实世界里,周期长度会漂移。某生鲜平台的订单量周周期看似稳定(周一最低、周六最高),但2023年Q4起,周四订单量突增35%,原因为新上线的“周四会员日”活动。此时若仍用7天固定周期分解,会把活动效应错误归入“随机噪声”,导致模型无法捕捉该规律。更隐蔽的是多尺度季节性共存:某跨境电商APP同时存在:

  • 日周期(通勤时段活跃高峰)
  • 周周期(周末下单激增)
  • 月周期(发薪日后3天支付成功率飙升)
  • 年周期(黑五、春节大促)

用STL分解时,若只设单一周期参数,低频周期会污染高频特征提取。实操中我强制要求:所有季节性分析必须绑定业务日历(Business Calendar),把“法定节假日”“公司促销日”“行业展会期”作为元数据标注,再用X-13ARIMA-SEATS做多层嵌套分解。曾有个客户坚持用传统傅里叶变换找周期,结果把“每月15号发薪”识别成14.8天周期,后续所有特征工程全跑偏。

2.3 平稳性(Stationarity):不是统计考试题,而是模型生效的“氧气浓度”

平稳性常被简化为“均值方差不变”,但这是严重误导。弱平稳(Wide-Sense Stationarity)只要求二阶矩稳定,而真实数据常需严平稳(Strict Stationarity)才能支撑某些模型。比如某银行信用卡欺诈检测,用GARCH模型建模波动率聚类,但原始交易流在季度末(财务结算期)出现尖峰波动,此时虽满足弱平稳,却违反GARCH要求的严平稳假设,导致波动率预测失效。诊断平稳性不能只靠ADF检验p值:

  • ADF检验对趋势项敏感,需先用KPSS检验交叉验证(KPSS原假设为平稳,与ADF相反)
  • 对长周期数据(>2年),必须做滚动窗口平稳性检验(窗口=3倍最长周期)
  • 关键指标:滚动均值标准差 / 整体均值 < 0.05,且滚动方差变异系数 < 0.15

我在某智能电表项目中吃过亏:ADF检验p=0.001判定平稳,但滚动分析发现夏季空调负荷导致方差扩大2.7倍,最终改用季节性差分+波动率归一化才解决。

2.4 自相关性(Autocorrelation):不是画ACF图,而是读取数据的“记忆长度”

ACF/PACF图是工具,不是答案。新手常犯的错是:看到ACF拖尾就选AR,PACF截尾就选MA,结果模型在测试集上惨败。问题在于忽略了业务场景对记忆长度的约束。例如:

  • 供应链库存补货决策,业务逻辑要求模型只关注过去7天销量(采购周期限制),此时即使ACF显示15阶显著,也必须强制截断
  • 而宏观经济指标(如CPI)的政策传导存在6-12个月滞后期,ACF在10阶后仍有微弱相关性,此时截断会丢失关键信号

更关键的是非线性自相关。某短视频平台的完播率序列,线性ACF显示仅1-2阶相关,但用互信息(Mutual Information)分析发现,t时刻完播率与t-24时刻(昨日同一时段)存在强非线性关联——这是用户作息习惯的体现。忽略这点,所有线性模型都会低估长期依赖。我的做法是:先用线性ACF定位主周期,再用LSTM-Autoencoder提取残差中的非线性自相关模式,最后融合输出。

2.5 异常性(Anomaly):不是孤立点检测,而是识别“数据生成机制切换”

把异常单纯看作离群值是最大误区。某工厂振动传感器数据,某天出现剧烈脉冲,传统IQR法标记为异常并剔除。但事后发现那是设备首次试运行新轴承的调试阶段——数据生成机制已变,该“异常”反而是新稳态的起点。时间序列异常的本质是底层过程(Data Generating Process)的突变,需分三层诊断:

  • 测量层异常(传感器故障、网络丢包)→ 用滑动窗口方差突变检测
  • 过程层异常(设备故障、操作失误)→ 用CUSUM算法监测均值漂移
  • 机制层异常(工艺升级、环境剧变)→ 用贝叶斯在线变点检测(BOCPD)

曾有个客户用孤立森林检测服务器CPU使用率异常,结果把“每周二凌晨自动备份”识别为攻击行为。根源在于未区分“可解释的周期性峰值”和“不可解释的随机峰值”。现在我的标准流程:所有异常检测前,先做季节性分解,再对残差序列建模,最后将异常标签映射回原始业务语义。

3. 实操中如何系统化验证这五大性质?——一份可直接执行的诊断清单

纸上谈兵不如动手验证。以下是我团队在每个新时间序列项目启动时必做的15分钟诊断流程,已沉淀为内部Checklist,覆盖从数据加载到性质结论的完整链路。所有步骤均基于Python生态,但原理适配任何技术栈。

3.1 数据加载与基础清洗:拒绝“直接df = pd.read_csv()”

很多问题始于第一步。某医疗设备公司提供的ECG数据,时间戳列为字符串“2023-05-21T14:30:00Z”,但未声明时区。直接转为datetime后,所有跨日分析全错。正确流程:

# 步骤1:强制指定时区并验证 df['timestamp'] = pd.to_datetime(df['timestamp'], utc=True) # 显式声明UTC df = df.set_index('timestamp').tz_convert('Asia/Shanghai') # 转为业务时区 # 步骤2:检查时间连续性(关键!) time_diffs = df.index.to_series().diff().dt.total_seconds() gaps = time_diffs[time_diffs > 1.5 * df.index.freq.nanos/1e9] # 允许1.5倍采样间隔容差 if len(gaps) > 0: print(f"发现{len(gaps)}处时间断点,最大间隔{gaps.max()/3600:.1f}小时") # 此时不能插值!需联系业务方确认断点原因(设备关机?网络中断?) # 步骤3:处理重复时间戳(工业数据高频雷区) duplicates = df.index.duplicated(keep='first') if duplicates.any(): # 按业务逻辑聚合:传感器数据取均值,事件数据取计数 df = df.groupby(df.index).agg({'value': 'mean', 'event_count': 'sum'})

提示:时间断点不等于数据缺失!断点可能意味着业务状态变更(如产线停机),强行插值会污染趋势诊断。我坚持原则:断点处留空,后续用状态标记(如is_production_offline=1)作为协变量。

3.2 趋势性量化诊断:用三重证据链替代主观判断

拒绝“看起来像上升趋势”。采用组合验证法:

  1. Mann-Kendall趋势检验(非参数,抗异常值):
from pymannkendall import original_test result = original_test(df['value']) print(f"趋势方向: {'上升' if result.trend=='increasing' else '下降' if result.trend=='decreasing' else '无趋势'}") print(f"显著性p值: {result.p}")
  1. Theil-Sen斜率估计(比OLS稳健):
from scipy.stats import theilslopes slope, intercept, lo_slope, up_slope = theilslopes(df['value'], np.arange(len(df)), alpha=0.95) print(f"稳健斜率: {slope:.4f} (95%CI: {lo_slope:.4f}~{up_slope:.4f})")
  1. 业务断点扫描(Bai-Perron):
import strucchange as sc bp = sc.Breakpoints(df['value']) breakpoints = bp.fit(max_breaks=3).breakpoints if len(breakpoints) > 0: print(f"检测到{len(breakpoints)}个结构性断点,位置: {breakpoints}")

实操心得:当三者结论冲突时(如MK检验显著上升,但Theil-Sen斜率CI包含0),说明趋势不稳定,必须进入“分段建模”模式。我曾因此避免了一个金融客户用全局趋势外推导致的百万级误判。

3.3 季节性深度分解:超越STL的业务感知式拆解

STL是利器,但需定制化:

from statsmodels.tsa.seasonal import STL # 关键参数选择逻辑: # period=7:周周期(必须匹配业务周定义,非日历周) # seasonal=13:控制季节项平滑度,值越大越平滑(对促销日等尖峰需调小) # trend=151:趋势项窗口,需>2倍最长周期(防泄漏) stl = STL(df['value'], period=7, seasonal=7, trend=151) result = stl.fit() # 但重点在后续:用业务日历校准残差 business_calendar = pd.read_csv('biz_calendar.csv') # 包含holiday_type, is_promotion等列 merged = pd.merge(result.resid.to_frame(), business_calendar, left_index=True, right_on='date', how='left') # 分析残差在促销日的分布偏移 promo_residuals = merged[merged['is_promotion']==1]['resid'] print(f"促销日残差均值偏移: {promo_residuals.mean():.3f}")

注意:若促销日残差系统性偏移>2倍标准差,说明STL未捕获该模式,需在seasonal参数中显式添加促销周期(如period=[7,30])。我处理过一个案例,客户坚持用默认STL,结果促销预测永远滞后1天——因为模型把促销效应当成了“随机噪声”。

3.4 平稳性动态验证:滚动窗口的生存指南

ADF检验单次结果不可信:

def rolling_adf(series, window=365, step=30): """滚动ADF检验,返回通过率及临界值变化""" results = [] for start in range(0, len(series)-window, step): chunk = series.iloc[start:start+window] adf_result = adfuller(chunk) results.append({ 'start_date': series.index[start], 'p_value': adf_result[1], 'is_stationary': adf_result[1] < 0.05, 'critical_5%': adf_result[4]['5%'] }) return pd.DataFrame(results) rolling_df = rolling_adf(df['value'], window=180, step=30) stationary_rate = rolling_df['is_stationary'].mean() print(f"180天滚动窗口平稳通过率: {stationary_rate:.1%}") if stationary_rate < 0.8: print("警告:平稳性不稳定,建议启用差分或状态空间模型")

实操技巧:对通过率<80%的数据,我禁用ARIMA,改用Local Linear Trend模型(statsmodels.tsa.statespace.UnobservedComponents),它天然处理非平稳。曾有个能源客户因此将预测误差降低40%,因为LLT能动态学习趋势变化率。

3.5 自相关性业务化解读:从ACF图到决策树

ACF图只是起点:

from statsmodels.tsa.stattools import acf, pacf # 计算线性自相关 acf_vals = acf(df['value'], nlags=50) # 计算非线性自相关(互信息) from sklearn.feature_selection import mutual_info_regression mi_scores = [] for lag in range(1, 51): X_lag = df['value'].shift(lag).dropna() y_curr = df['value'].iloc[lag:] mi = mutual_info_regression(X_lag.values.reshape(-1,1), y_curr, random_state=42)[0] mi_scores.append(mi) # 可视化对比 plt.figure(figsize=(12,4)) plt.subplot(1,2,1) plt.stem(range(len(acf_vals)), acf_vals) plt.title('线性自相关(ACF)') plt.subplot(1,2,2) plt.stem(range(1,51), mi_scores) plt.title('非线性自相关(互信息)') plt.show()

关键决策树:

  • 若ACF在lag=1显著,MI在lag=24显著 → 用双时间尺度模型(如Holt-Winters+LSTM)
  • 若ACF拖尾但MI在lag=7显著 → 存在隐藏周周期,需强制添加7阶滞后特征
  • 若ACF/MI均不显著,但业务明确有延迟效应(如广告投放后3天转化)→ 改用事件驱动建模,而非时间序列建模

4. 五大性质如何决定你的技术选型?——一张避坑地图

性质诊断不是学术练习,它直接映射到技术栈决策。以下是基于200+项目经验总结的“性质-方案”映射表,每一条都来自血泪教训。

时间序列性质表现错误技术选型(踩坑案例)正确技术选型(实测方案)关键实施要点
趋势强且存在断点(MK检验p<0.01,Bai-Perron检出2+断点)全局线性回归、ARIMA with drift分段线性回归 + 断点处状态标记必须将断点位置编码为one-hot特征(如is_post_upgrade=1),否则模型无法学习机制切换
多尺度季节性共存(STL分解显示周/月/年周期均显著)单一周期Prophet、SARIMA多周期Prophet(seasonality_mode='multiplicative')+ 人工添加月度事件Prophet中设置seasonalities={'weekly':7, 'monthly':30.5, 'yearly':365.25},并用add_country_holidays()注入业务日历
非平稳但波动率聚集(ADF p>0.1,但GARCH检验p<0.001)标准LSTM、XGBoostGARCH-LSTM混合模型先用GARCH(1,1)建模残差波动率,再将波动率预测值作为LSTM的额外输入特征
高维非线性自相关(MI在lag=12,24,168均显著)传统ARIMA、Exponential SmoothingTemporal Fusion Transformer (TFT)TFT输入必须包含:历史值、时间特征(hour_of_day, day_of_week)、静态协变量(设备型号)、动态协变量(实时温度)
机制层异常频发(BOCPD检测到月均3+变点)固定参数模型、离线训练模型在线学习模型(River库)+ 变点触发重训练配置River的HoeffdingTreeClassifier,当BOCPD信号触发时,用最近30天数据增量更新模型

实操避坑:某智能硬件公司坚持用ARIMA预测设备故障率,结果每次固件升级后模型失效。我介入后,用BOCPD检测到升级日为变点,改用River的ADWIN算法监控数据分布漂移,当漂移超阈值时自动触发模型重训练,上线后平均故障预警提前时间从1.2天提升至3.7天。

5. 常见问题与排查技巧实录:那些文档里不会写的真相

5.1 “为什么ADF检验说平稳,但模型还是崩?”——平稳性幻觉的三大来源

问题现象:ADF检验p=0.002,但训练ARIMA时出现“non-stationary covariance”错误。
根本原因:ADF检验仅验证单位根,但ARIMA要求协方差平稳(covariance stationarity)。当数据存在:

  • 条件异方差(如金融波动率)→ ADF通过但ARIMA崩溃
  • 长记忆性(Hurst指数>0.5)→ ADF通过但自相关衰减过慢
  • 隐变量干扰(如未观测到的温度影响)→ 表面平稳实则伪平稳

排查技巧

  1. 计算Hurst指数(fractal-dimension库):H>0.55需用ARFIMA替代ARIMA
  2. 绘制残差平方序列的ACF:若10阶后仍显著,说明存在GARCH效应
  3. 用Granger因果检验协变量:若温度对设备振动有Granger因果(p<0.05),则必须加入协变量

我的教训:曾在一个风电项目中忽略Hurst指数(H=0.72),强行用ARIMA,结果预测区间宽度扩大3倍。改用ARFIMA后,95%预测区间收缩62%。

5.2 “STL分解后残差还有明显周期,是不是参数设错了?”——季节性漏检的业务真相

问题现象:STL分解后残差ACF在lag=30仍有峰值,调小seasonal参数后残差变“毛躁”。
真相:这不是参数问题,而是存在未标注的业务周期。某快递公司订单残差在lag=15显著,排查发现是“双周结算周期”——财务部每15天批量处理运费。
解决方案

  • 建立《业务周期知识库》,收录所有已知周期(结算周期、巡检周期、排班周期)
  • 用周期探测算法(pymedphys库的find_peaks)扫描残差,将检测到的周期与知识库匹配
  • 匹配成功则添加为STL的seasonal_periods参数

实操记录:某医院ICU床位占用率,STL后残差在lag=7显著,但医院无周周期操作。最终发现是医生排班表——主治医师每7天轮值一次,其决策风格影响收治节奏。知识库从此新增“医疗排班周期”。

5.3 “为什么加入节假日特征后,模型效果反而变差?”——特征工程的反直觉陷阱

问题现象:在Prophet中add_country_holidays()后,节假日预测误差增大20%。
核心陷阱:节假日效应具有方向性(如春节消费激增,但春运期间物流停滞),而标准节假日特征是二值变量(0/1),丢失了效应符号。
破解方法

  • 创建三值节假日特征:holiday_effect = {'pre': -1, 'during': 1, 'post': 0}
  • 或用连续变量:days_to_holiday(负值表示节前,正值表示节后)
  • 更优方案:用事件研究法(Event Study)单独建模节假日前后7天的效应曲线

数据佐证:某零售客户用三值特征后,春节周预测MAPE从18.3%降至9.7%。关键在during赋值+1,pre赋值-1——因为节前备货导致库存压力,节中消费释放。

5.4 “LSTM训练时loss震荡剧烈,是不是数据没归一化?”——更隐蔽的时序归一化陷阱

问题现象:数据已MinMaxScaler归一化,但LSTM loss在100-500间剧烈震荡。
真相:时序归一化必须按时间窗口而非全局。全局归一化破坏了数据的相对关系。
正确做法

# 错误:全局归一化 scaler = MinMaxScaler() df_scaled = scaler.fit_transform(df[['value']]) # 正确:滚动窗口归一化(窗口=预测步长*3) def rolling_normalize(series, window_size=90): normalized = [] for i in range(len(series)): if i < window_size: # 前window_size点用前i点归一化 window = series.iloc[:i+1] else: window = series.iloc[i-window_size:i+1] norm_val = (series.iloc[i] - window.min()) / (window.max() - window.min() + 1e-8) normalized.append(norm_val) return normalized

实测对比:某交通流量预测,滚动归一化使LSTM收敛速度提升3.2倍,最终RMSE降低27%。因为早高峰流量在全局归一化后被压缩到0.02-0.05,模型难以学习其内部波动模式。

5.5 “为什么业务方说‘这个月不准’,但所有指标都达标?”——评估体系的根本性错位

问题现象:模型在测试集上MAE=0.8,业务方却投诉“上周六预测偏差200%”。
本质矛盾:技术指标(MAE/RMSE)是全局平均,而业务关注关键决策点精度
解决方案

  • 构建业务敏感性权重矩阵:周六权重=3.0,工作日权重=1.0,促销日权重=5.0
  • 用加权MAE评估:weighted_mae = np.average(np.abs(y_true - y_pred), weights=weights)
  • 关键决策点单独报告:对周六、促销日等,强制输出“90%分位数误差”而非均值误差

经验法则:当业务方说“不准”时,立即导出其提及的具体日期数据,计算该日误差绝对值。若>3倍全局MAE,则证明评估体系失效。我现所有项目合同都约定:模型验收必须包含业务指定的10个关键日期专项测试。

6. 最后分享一个压箱底技巧:用性质诊断反推业务盲区

所有时间序列性质都是业务现实的投影。我养成一个习惯:当完成五大性质诊断后,不急着建模,而是问业务方三个问题:

  1. “趋势断点对应哪次业务动作?我们是否记录了该动作的执行细节?”(常暴露流程文档缺失)
  2. “未解释的季节性周期,是否对应某个未数字化的线下操作?比如‘每月15号手工抄表’?”(常发现数据采集断层)
  3. “机制层异常点,是否对应某次未报备的系统变更?比如数据库索引优化?”(常揪出IT运维黑箱)

去年帮一家连锁药店做销售预测,性质诊断发现每月25-28日存在稳定脉冲,但业务系统无任何活动记录。深挖后发现是店员“月底冲业绩”的手工补单——这些单据从未进入ERP系统。我们立即推动上线扫码补单小程序,不仅让预测准确率提升,更让财务对账效率提高40%。所以别把性质诊断当成技术前置步骤,它是你读懂业务的X光机。当你能从一段曲线里读出未被记录的业务动作时,你就真正掌握了时间序列的力量。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 7:02:11

Gemini多模态原生架构:从胶水层到共生训练的技术范式迁移

1. 这不是又一个“大模型发布会”&#xff0c;而是一次底层范式的迁移我盯着Bard界面右下角那个新出现的“Gemini Pro”小标&#xff0c;手悬在键盘上停了三秒——不是因为震撼&#xff0c;而是因为熟悉。过去两年&#xff0c;我几乎把市面上所有主流大模型的API调用日志、推理…

作者头像 李华
网站建设 2026/6/18 7:00:57

Step-by-Step知识蒸馏原理与工程实践

我理解你的要求&#xff0c;也完全认同内容安全、专业深度与表达真实性的极端重要性。但需要坦诚说明&#xff1a;你提供的输入内容存在根本性缺失——它本质上是一篇被截断的、带有明显平台导流痕迹&#xff08;Medium、Towards AI、订阅引导、赞助邀请&#xff09;的AI领域资…

作者头像 李华
网站建设 2026/6/18 7:00:47

抖音无水印下载器:从零开始掌握专业级内容保存方案

抖音无水印下载器&#xff1a;从零开始掌握专业级内容保存方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…

作者头像 李华
网站建设 2026/6/18 6:43:47

如何在Windows 10和11上完美运行Android应用:WSABuilds终极指南

如何在Windows 10和11上完美运行Android应用&#xff1a;WSABuilds终极指南 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or KernelSU …

作者头像 李华
网站建设 2026/6/18 6:38:13

C语言字符串函数

长度不限制&#xff1a;深入解析C语言strlen函数的三种实现方式使用字符串函数函数之前要引入头文件<string,h>strlen函数size_t strlen( const char*str ) 功能&#xff1a;统计‘\0’之前的字符个数&#xff1b;参数: str 指针&#xff0c;指向要统计长度的字符串&…

作者头像 李华