c - 将字符串拆分为不同的部分,没有空格和分隔符
问题描述
我有一个字符串 2020122812.txt,我希望能够从中提取四位数年份、二位数月份、二位数日期和二位数小时的数字。
下面是我尝试执行此操作的代码片段,其中 2020122812.txt 将作为第一个参数输入:
int main(int argc, char *argv[])
{
char txtfName[500];
int bYYYY;
int bMM;
int bDD;
int bHH;
sprintf(txtName,"%s",argv[1]);
sscanf(txtName,"%.4d%.2d%0.2d%0.2d.txt",YYYY,MM,DD,HH);
printf("YYYY=%d\n",YYYY);
printf("MM=%d\n",MM);
printf("DD=%d\n",DD);
printf("HH=%d\n",HH);
}
不幸的是,我得到 YYYY、MM、DD、HH 的零,而不是期望的结果:
2020 for YYYY
12 for MM
28 for DD
12 for HH.
如何调整此代码以获得我想要的结果?
解决方案
与 不同printf()
,转换说明符scanf()
没有指定精度的选项。读取的最大长度应指定不带.
.
固定代码:
#include <stdio.h>
int main(int argc, char *argv[])
{
int YYYY;
int MM;
int DD;
int HH;
if (argc < 2) return 1;
if (sscanf(argv[1],"%4d%2d%2d%2d.txt",&YYYY,&MM,&DD,&HH) != 4) return 1;
printf("YYYY=%d\n",YYYY);
printf("MM=%d\n",MM);
printf("DD=%d\n",DD);
printf("HH=%d\n",HH);
}
这些错误也已在此代码中修复:
- 未包含必需的标头。
- 未检查参数的数量。
- 的结果
sscanf()
没有被检查。 - 使用了未声明的标识符。
&
的论点中缺少sscanf()
。- 复制输入只是为了造成缓冲区溢出的风险。
推荐阅读
- python - 最小化给定样本的自定义 3D 成本函数 - Python 3.5
- python - 熊猫从多个列名列表构建数据框的最佳方法
- reactjs - Reactjs:ReferenceError:未定义剑道
- batch-file - 在子例程中退出批处理文件
- architecture - 是事件代理将事件传递给事件处理器还是事件处理器总是监听事件代理
- shopify - Shopify 液体模板:仅重复一次 HTML 代码
- powershell - How to get regex exact coincidence with a var on Powershell
- windows - Delphi / Amazon S3 exe 不向后兼容
- python - 将新列添加到重塑的数据框
- mysql - 停止 SQL 中缺少 ID 号的自动增量?