sscanf c ++将字符串拆分为int有时不起作用

时间:2013-02-24 12:37:16

标签: c++ string split int scanf

我正在编写一个程序,将日期字符串转换为三个独立的int变量:year,month,day。

int m,d,y;
sscanf("2011-03-08","%i %*[-] %i %*[-] %i",&y,&m,&d);
cout << y<<" "<<m<<" "<<" "<<d<<std::endl;
sscanf("2011-03-07","%i %*[-] %i %*[-] %i",&y,&m,&d);
cout << y<<" "<<m<<" "<<" "<<d;

如果我转换2011-03-08或2011-03-09,那一天将是0,但是对于2011-03-07,06,......那天是7,6,...就像我想的那样期望。有人可以解释一下,为什么它不适用于08或09而且只适用于它们?

提前谢谢!

3 个答案:

答案 0 :(得分:5)

请参阅sscanf

  

<强> I
  匹配可选的有符号整数;下一个指针必须是指向int的指针。如果以0x或0X开头,则以16为基数读取整数;如果以0开头,则在基数8中读取整数,否则以10为基数读取。仅使用与基础对应的字符。

08将被扫描为八进制整数,因为它以0开头。但是08不是有效的八进制整数,而07是。{1}}。如果您使用%d代替%i,它将按预期工作。

sscanf("2011-03-08","%d %*[-] %d %*[-] %d", &y, &m, &d);

甚至更简单

sscanf("2011-03-08","%d-%d-%d", &y, &m, &d);

根据您对结果的处理方式,您还可以考虑strptime

  

strptime - 将时间的字符串表示转换为时间tm结构

struct tm t;
strptime("2011-03-08, "%Y-%m-%d", &t);

答案 1 :(得分:2)

问题是%i08视为八进制整数,因此可能的解决方案是使用%d代替,因为这是C ++,您应该使用std::istringstream#include <sstream>)代替:

int y,m,d;
char delimiter;

std::istringstream dateStream("2011-03-08");
dateStream >> y >> delimiter >> m >> delimiter >> d;

std::cout << y << " " << m << " " << d;

答案 2 :(得分:1)

您的格式字符串错误...应该只是"%4d-%02d-%02d"

使用if (3 != sscanf(...)) { /* failed */ }

检查sscanf是否也能正常工作也没什么坏处