scanf的“正则表达式”是否支持标准?

scanf的“正则表达式”是否支持标准? 我无法在任何地方找到答案。

此代码适用于gcc,但不适用于Visual Studio:

scanf("%[^\n]",a); 

它是Visual Studio错误还是gcc扩展?

编辑:看起来像VS工作,但必须考虑Linux和Windows之间的行结束的差异。(\ r \ n)

该特定格式字符串应该在符合要求的实现中正常工作。 [字符引入了一个用于匹配非空字符集的扫描集( ^表示扫描集是所提供字符的反转)。 换句话说,格式说明符%[^\n]应匹配每个不是换行符的字符。

从C99 7.19.6.2开始,略有释义:

[ format specifier]匹配一组预期字符(scanset)中的非空字符序列。 如果不存在l length修饰符,则相应的参数应该是指向大小足以接受序列的字符数组的初始元素的指针以及将自动添加的终止空字符。

如果存在l长度修饰符,则输入应为从初始移位状态开始的多字节字符序列。 每个多字节字符都转换为宽字符,就好像通过调用mbrtowc函数一样, mbstate_t对象描述的转换状态在转换第一个多字节字符之前初始化为零。 相应的参数应该是指向wchar_t数组的初始元素的指针,该数组足够大以接受序列和终止的空宽字符,这将自动添加。

转换说明符包括格式字符串中的所有后续字符,直到并包括匹配的右括号] 。 括号(扫描列表)之间的字符组成扫描集,除非左括号后面的字符是抑扬符号^ ,在这种情况下,扫描集包含旋转和右括号之间的扫描列表中未出现的所有字符。 如果转换说明符以[][^]开头,则右括号字符位于扫描列表中,下一个右括号字符是结束规范的匹配右括号; 否则第一个右括号字符是结束规范的字符。 如果-字符在扫描列表中并且不是第一个字符,也不是第一个字符是^的第二个字符,也不是最后一个字符,则行为是实现定义的。

如果MSVC无法正常工作,这可能只是微软要么不符合最新标准的许多例子中的一个,要么认为他们知道的更好:-)

scanf()"%["格式规范是标准的,自C90以来就是如此。

MSVC确实支持它。

您还可以提供格式规范的字段宽度,以防止缓冲区溢出:

 int main() { char buf[9]; scanf("%8[^\n]",buf); printf("%s\n", buf); printf("strlen(buf) == %u\n", strlen(buf)); return 0; } 

另请注意, "%["格式规范并不意味着scanf()支持正则表达式。 那个特定的格式规范类似于正则表达式的能力(毫无疑问是受正则表达式的影响),但它比正则表达式更有限。