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

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而且只适用于它们?

先感谢您!

Ola*_*che 5

看到 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)