使用 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
这是什么原因?
在这种情况下,最好使用 %d 而不是 %i。对于 %i,如果该值有前导零,则该值将被读取为八进制值(基数 8)。 08 和 09 不是有效的八进制值。
scanf 将 return 成功扫描的项目数。使用
if ( scanf("%d:%d:%d", &hh, &mm, &ss) == 3)
验证扫描了三个项目。
下面的代码用来解析像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
这是什么原因?
在这种情况下,最好使用 %d 而不是 %i。对于 %i,如果该值有前导零,则该值将被读取为八进制值(基数 8)。 08 和 09 不是有效的八进制值。
scanf 将 return 成功扫描的项目数。使用
if ( scanf("%d:%d:%d", &hh, &mm, &ss) == 3)
验证扫描了三个项目。