sscanf C++ 将字符串拆分为整数有时不起作用

sscanf c++ splitting string to ints sometimes doesn't work

本文关键字:整数 不起作用 拆分 C++ 字符串 sscanf      更新时间:2023-10-16

我正在编写一个程序,该程序将日期字符串转换为三个独立的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,而且只适用于他们?

提前谢谢!

参见sscanf

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

08将被扫描为八进制整数,因为它以0开头。但08不是有效的八进制整数,而07是。如果使用%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);

问题是%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;

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

检查sscanf是否也能与if (3 != sscanf(...)) { /* failed */ } 一起工作也无妨