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
你这里有两个问题。第一的
%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)
并得到相同的结果。