首页 > 解决方案 > 将字符串拆分为不同的部分,没有空格和分隔符

问题描述

我有一个字符串 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.  

如何调整此代码以获得我想要的结果?

标签: cstringsplitscanf

解决方案


与 不同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()
  • 复制输入只是为了造成缓冲区溢出的风险。

推荐阅读