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

时间:2015-03-26 23:22:01

标签: c parsing time scanf

以下代码用于解析时间,如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

1 个答案:

答案 0 :(得分:4)

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

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

验证是否扫描了三件物品。