为什么 sscanf 无法从一个字符串中读取 uint64_t 和 char?

Jia*_* Xu 1 c++ char cstdint cstdio

#include <cstdio>
#include <cstdint>
#include <cassert>

int main() {
    std::uint64_t ui;
    char c;
    auto ret = std::sscanf("111K", "%lu64%[B, K, M, G]", &ui, &c);

    assert(ret == 2);
    assert(ui == 111);
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用从一个字符串sscanf读取 auint64_t和 a ,但每次我尝试此操作时char它都只读取它ui(断言失败)。ret == 2

Nat*_*ica 5

你这里有两个问题。第一的

%lu64
Run Code Online (Sandbox Code Playgroud)

应该

"%" SCNu64 
Run Code Online (Sandbox Code Playgroud)

读入 64 位整数。

第二个问题是

%[B, K, M, G]
Run Code Online (Sandbox Code Playgroud)

当它填充 c 字符串时,需要一个char*or作为其输出参数。wchar_t*你需要改变

char c;
Run Code Online (Sandbox Code Playgroud)

至少到

char c[2] // 2 because it adds a null terminator
Run Code Online (Sandbox Code Playgroud)

以便捕捉K。我们把所有这些放在一起,我们得到

auto ret = std::sscanf("111K", "%" SCNu64 "%[B, K, M, G]", &ui, c);
Run Code Online (Sandbox Code Playgroud)

请注意

%[B, K, M, G]
Run Code Online (Sandbox Code Playgroud)

实际上是在尝试匹配括号内的所有空格和逗号。你也可以写成

%[BKMG]
Run Code Online (Sandbox Code Playgroud)

并得到相同的结果。