方括号在sscanf中如何工作?

方括号在sscanf中如何工作?,c,scanf,C,Scanf,我试图用sscanf读取由整数和带引号的字符串组成的行。 我的格式化字符串类似于“\%m[^\”]s\”,%x“sscanf在引号内给出一个字符串,但不在第二个字段中给出其余的输入。我还尝试了“\%m[^\”]s%c“,因此结束报价应进入%csscanf再次只给出一个字段。只使用%s它就可以工作,而使用%[]s它就不能工作。假设输入字符串是“\'Hello here\”,32“,那么这就是sscanf()使用格式化字符串”\%m[^\]s\,%x“读取它的方式: 格式化字符串中的\“与输入中的

我试图用
sscanf
读取由整数和带引号的字符串组成的行。
我的格式化字符串类似于
“\%m[^\”]s\”,%x“
sscanf
在引号内给出一个字符串,但不在第二个字段中给出其余的输入。我还尝试了
“\%m[^\”]s%c“
,因此结束报价应进入
%c
sscanf
再次只给出一个字段。只使用
%s
它就可以工作,而使用
%[]s
它就不能工作。

假设输入字符串是
“\'Hello here\”,32“
,那么这就是
sscanf()
使用格式化字符串
”\%m[^\]s\,%x“
读取它的方式:

  • 格式化字符串中的
    \“
    与输入中的
    \”
    匹配(并且它被丢弃)
  • %m[^\“]
    1与
    你好
    匹配
  • 格式化字符串中的
    s
    \“
    不匹配,因此扫描结束
要使用的格式字符串是“\%m[^\“]\”,%x”

有关
sscanf()
及其格式化字符串的详细信息,请阅读和/或


1请注意,
m
修饰符不是标准C(即使它是`POSIX标准的一部分)。

s不是
%[
格式说明符的一部分。放下它。您读过文档了吗?请注意,
%m[^\]中的
m
正在使用标准C库的非标准扩展。@chux是的,我知道,
m
修饰符是一个POSIX扩展。我只是假设OP正在使用POSIX设置,因此这不会是他的问题的原因。但是对于未来的读者,我会在我的回答中添加一个注释。