4

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

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 并且仅适用于他们?

先感谢您!

4

3 回答 3

5

sscanf

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

08将被扫描为八进制整数,因为它以0. But08不是有效的八进制整数,而07is。如果您使用%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);
于 2013-02-24T12:48:02.147 回答
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;
于 2013-02-24T12:50:17.837 回答
1

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

检查 sscanf 是否也可以与if (3 != sscanf(...)) { /* failed */ }

于 2013-02-24T12:49:48.107 回答