使用 scanf 解析 hh:mm:ss,一些输入出现奇怪的错误

using scanf to parse hh:mm:ss, strange error with some inputs

下面的代码用来解析像07:04:51这样的时间:

#include <stdio.h>

int main() {
    int hh, mm, ss;
    scanf("%i:%i:%i\n", &hh, &mm, &ss);
    printf("%i:%i:%i\n", hh, mm, ss);
}

有些时候可以解析,有些则不能:

$ echo 07:04:51 | ./test.exe 
7:4:51
$ echo 08:04:51 | ./test.exe 
0:0:32767
$ echo 09:04:51 | ./test.exe 
0:0:32766
$ echo 10:04:51 | ./test.exe 
10:4:51
$ echo 11:09:10 | ./test.exe 
11:0:32764

这是什么原因?

ideone

在这种情况下,最好使用 %d 而不是 %i。对于 %i,如果该值有前导零,则该值将被读取为八进制值(基数 8)。 08 和 09 不是有效的八进制值。
scanf 将 return 成功扫描的项目数。使用

if ( scanf("%d:%d:%d", &hh, &mm, &ss) == 3)

验证扫描了三个项目。