我正在编写一个程序,将日期字符串转换为三个独立的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而且只适用于它们?
提前谢谢!
答案 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)
问题是%i
将08
视为八进制整数,因此可能的解决方案是使用%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 */ }