2011-04-21 33 views
6

我想扫描线,如逸出sscanf的方括号]

"[25, 28] => 34" 

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

#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; 
} 

编译这给

warning: unknown escape sequence '\]' 

和输出

a1 = 25 
a2 = 28 
i = -1073746244 

如果我将其更改为

sscanf(line, "[%[^,], %[^]] => %i", a1, a2, &i); 

我没有得到任何编译器的投诉,但仍然

a1 = 25 
a2 = 28 
i = -1073746244 

我知道这个问题是在第二个令牌,因为

sscanf(line, "[%[^,], %[]] => %i", a1, a2, &i); 

a1 = 25 
a2 = 28 
i = 34 

但我想为第二个标记使用终止条件。我怎么做?

回答

10

你想

sscanf(line, "[%[^,], %[^]]] => %i", a1, a2, &i); 

注意三个连续]字符 - 第一个是你不想在%[集相匹配的字符,第二端设置的开始与%[和第三个匹配输入中的]字符

-2

可以尝试

sscanf(line, "[%s, %s] => %d", a1, a2, &i); 
+0

-1将不起作用 - '%s'将所有内容匹配到下一个空格,所以它会吸收下面的标点符号(','或']'),随后的匹配将失败。 – 2011-04-21 23:05:14

+0

天哪,我有点落伍了...... 8)很好地投了票。 – ColWhi 2011-04-21 23:07:39

4

正如其他人所说的......我不能完全确定要在这里做什么?

假设括号内的事总是整数,你可能只是做:

int a, b, c; 
sscanf(line, "[%d, %d] => %d", &a,&b,&c); 

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

sscanf(line, "[%[^,], %[^]]] => %d", a1, a2, &i); 

第二个正则表达式应该匹配除了]之外的所有字符。我相信你企图逃走前],但这不是必需的编译器抛出一个错误,因为它不知道如何处理逃逸。

那里a2捕获子句中有3 ],因为第一个是说,“不包括在字符匹配集这个人物,”第二个是封闭字符匹配集,第三匹配][25, 28] => 34输入。

如果我完全误解了你的问题,只是澄清,我可以修改。

0

这听起来好像是一个编译器(或者,实际上,库)错误(虽然你的确需要3个右支架,而不是两个)。根据标准(C99,§7.19.6。2):

如果转换说明符以[]或[^]开头,则右括号字符位于扫描列表中,下一个右括号字符是结束规范的右括号;

2

看起来您的问题基本上归结为“如何将]字符包含到scanf扫描集”。这是可能的,你不需要逃避它。特别为此目的,语言规范指出,当]字符紧跟在开头[字符后面或紧跟在开头^字符后面时,该]被认为是扫描集的一部分,而不是结尾括号。所以,在你的情况下,格式说明符应该看起来像"[%[^,], %[^]]] => %i"。没有\必要。

我发现你几乎没有错,只是在第二个扫描集之后忘记了第三个]字符。