在sscanf中逃离方括号]

hig*_*dth 6 c parsing escaping scanf format-specifiers

我想扫描像

"[25, 28] => 34"
Run Code Online (Sandbox Code Playgroud)

我写了一个小程序来测试它:

#include <cstdlib>
#include <iostream>

int main() {
        char* line = "[25, 28] => 34";
        char a1[100],  a2[100];
        int i;
        sscanf(line, "[%[^,], %[^\]] => %i", a1, a2, &i);
        std::cout << "a1 = " << a1 <<"\na2 = " << a2 << "\ni = "<<i <<"\n";
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译这给出了

warning: unknown escape sequence '\]'
Run Code Online (Sandbox Code Playgroud)

和输出

a1 = 25
a2 = 28
i = -1073746244
Run Code Online (Sandbox Code Playgroud)

如果我改成它

sscanf(line, "[%[^,], %[^]] => %i", a1, a2, &i);
Run Code Online (Sandbox Code Playgroud)

我没有得到编译器投诉但仍然

a1 = 25
a2 = 28
i = -1073746244
Run Code Online (Sandbox Code Playgroud)

我知道问题出在第二个标记中,因为

sscanf(line, "[%[^,], %[0123456789]] => %i", a1, a2, &i);
Run Code Online (Sandbox Code Playgroud)

a1 = 25
a2 = 28
i = 34
Run Code Online (Sandbox Code Playgroud)

但我想为第二个令牌使用终止条件.我怎么做?

Chr*_*odd 11

你要

sscanf(line, "[%[^,], %[^]]] => %i", a1, a2, &i);
Run Code Online (Sandbox Code Playgroud)

注意三个连续的]字符 - 第一个是你不想在%[集合中%[匹配的]字符,第二个字符以从第一个开始的集合开始,第三个字符与输入中的字符匹配


pho*_*zed 5

正如其他人提到的......我不确定你想要做什么......

假设括号之间的东西总是整数,你可以这样做:

int a, b, c;
sscanf(line, "[%d, %d] => %d", &a,&b,&c);
Run Code Online (Sandbox Code Playgroud)

如果你真的坚持使用正则表达式并想要在括号之间传递一些通用的东西,你要找的是:

sscanf(line, "[%[^,], %[^]]] => %d", a1, a2, &i);
Run Code Online (Sandbox Code Playgroud)

第二个正则表达式应匹配除]最后的所有字符.我相信你试图逃避]之前,但这不是必要的,编译器抛出一个错误,因为它不知道如何处理该转义.

]在capture子句中有3个a2因为第一个是说"不在字符匹配集中包含这个字符",第二个是关闭字符匹配集,第三个匹配输入]中的[25, 28] => 34字符.

如果我完全误解了你的问题,请澄清并且我可以修改.