diff --git a/libc/fmt/vcscanf.c b/libc/fmt/vcscanf.c index 22aa93a26..3002113b9 100644 --- a/libc/fmt/vcscanf.c +++ b/libc/fmt/vcscanf.c @@ -174,6 +174,8 @@ int vcscanf(int callback(void *), int unget(int, void *), void *arg, c = callback(arg); if (c == prefix || c == prefix + ('a' - 'A')) { c = callback(arg); + } else if (c == -1) { + c = '0'; } } DecodeNumber: diff --git a/test/libc/fmt/sscanf_test.c b/test/libc/fmt/sscanf_test.c index 245c6fe86..399f7b604 100644 --- a/test/libc/fmt/sscanf_test.c +++ b/test/libc/fmt/sscanf_test.c @@ -231,3 +231,31 @@ TEST(sscanf, testInttypes_macros) { ASSERT_EQ(if64, 1); ASSERT_EQ(uf64, 1); } + +TEST(sscanf, test0) { + int v; + + v = 0xFFFFFFFF; + ASSERT_EQ(sscanf("0", "%x", &v), 1); + ASSERT_EQ(v, 0); + + v = 0xFFFFFFFF; + ASSERT_EQ(sscanf("0", "%X", &v), 1); + ASSERT_EQ(v, 0); + + v = 0xFFFFFFFF; + ASSERT_EQ(sscanf("0", "%d", &v), 1); + ASSERT_EQ(v, 0); + + v = 0xFFFFFFFF; + ASSERT_EQ(sscanf("0", "%o", &v), 1); + ASSERT_EQ(v, 0); + + v = 0xFFFFFFFF; + ASSERT_EQ(sscanf("0", "%u", &v), 1); + ASSERT_EQ(v, 0); + + v = 0xFFFFFFFF; + ASSERT_EQ(sscanf("0", "%b", &v), 1); + ASSERT_EQ(v, 0); +}