Fek*_*enc 4 c++ string int split scanf
我正在编写一个程序,将日期字符串转换为三个单独的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;
Run Code Online (Sandbox Code Playgroud)
如果我转换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);
Run Code Online (Sandbox Code Playgroud)
甚至更简单
sscanf("2011-03-08","%d-%d-%d", &y, &m, &d);
Run Code Online (Sandbox Code Playgroud)
根据您对结果的要求,您也可以考虑 strptime
strptime - 将时间的字符串表示转换为时间tm结构
struct tm t;
strptime("2011-03-08, "%Y-%m-%d", &t);
Run Code Online (Sandbox Code Playgroud)