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

bra*_*tao 18 c gcc scanf

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

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

scanf("%[^\n]",a);
Run Code Online (Sandbox Code Playgroud)

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

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

pax*_*blo 8

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

从C99 7.19.6.2开始,略有释义:

[格式说明从相匹配的一组预期的字符(在扫描集)的字符的非空序列.如果不存在l长度修饰符,则相应的参数应该是指向大小足以接受序列的字符数组的初始元素的指针以及将自动添加的终止空字符.

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

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

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


Mic*_*urr 6

"%["对格式规范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;
}
Run Code Online (Sandbox Code Playgroud)

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