【问题标题】:split string into different parts without spaces and dividers将字符串分成不同的部分,没有空格和分隔符
【发布时间】:2021-04-05 15:29:42
【问题描述】:

我有一个字符串 2020122812.txt,我希望能够从中提取四位数年份、二位数月份、二位数日期和二位数小时的数字。

下面是我的代码的 sn-p,我曾尝试在其中输入 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.  

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

【问题讨论】:

  • YYYYMMDDHH 在此处未声明。请发布Minimal, Reproducible Example。同样的东西被传递给scanf()printf() 来处理整数也是值得怀疑的。还有一点需要注意的是,最好将argv[1] 直接用于sscanf(),而不是仅仅为了创建缓冲区溢出风险而进行复制。

标签: c string split scanf


【解决方案1】:

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() 的结果未被检查。
  • 使用了未声明的标识符。
  • &amp; 的参数中缺少 sscanf()
  • 复制输入只是为了造成缓冲区溢出的风险。

【讨论】:

    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多