将字符串拆分为不同的部分,没有空格和分隔符

split string into different parts without spaces and dividers

我有一个字符串 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);
}

此代码中还修复了这些错误:

  • 未包括必需的 header。
  • 未检查参数的数量。
  • 未检查sscanf()的结果。
  • 使用了未声明的标识符。
  • &sscanf() 的参数中缺失。
  • 复制输入只是为了产生缓冲区溢出的风险。