scanf的“正则表达式”是否支持标准?我无法在任何地方找到答案。
此代码适用于gcc,但不适用于Visual Studio:
scanf("%[^\n]",a);
它是Visual Studio错误还是gcc扩展?
编辑:看起来VS工作正常,但必须考虑Linux和Windows之间的行结束差异。(\ r \ n)
答案 0 :(得分:8)
特定格式字符串应在符合要求的实现中正常工作。 [
字符引入了一个用于匹配非空字符集的扫描集(^
表示扫描集是所提供字符的反转)。换句话说,格式说明符%[^\n]
应匹配每个不是换行符的字符。
从C99 7.19.6.2,稍微解释:
[
格式说明符匹配一组预期字符(扫描集)中的非空字符序列。如果不存在l
长度修饰符,则相应的参数应该是指向大小足以接受序列的字符数组的初始元素的指针以及将自动添加的终止空字符。如果存在
l
长度修饰符,则输入应为从初始移位状态开始的多字节字符序列。每个多字节字符都转换为宽字符,就好像通过调用mbrtowc
函数一样,mbstate_t
对象描述的转换状态初始化为零 在转换第一个多字节字符之前。相应的参数应该是一个指向wchar_t
数组的初始元素的指针,该数组足以接受序列和终止的空宽字符,它将自动添加。转换说明符包括格式字符串中的所有后续字符,最多包括匹配的右括号
]
。括号(扫描列表)之间的字符组成扫描集,除非左括号后面的字符是旋转^
,在这种情况下,扫描集包含所有 旋转和右支架之间的扫描列表中没有出现的字符。如果转换说明符以[]
或[^]
开头,则右括号字符位于扫描列表中,下一个右括号字符是结束规范的匹配右括号;否则第一个右括号字符是结束规范的字符。如果扫描列表中的-
字符不是第一个,也不是第一个字符为^
的第二个字符,也不是最后一个字符,则行为是实现定义的。
如果MSVC无法正常工作,这可能只是微软要么不符合最新标准的许多例子之一,要么认为他们更了解: - )
答案 1 :(得分:6)
"%["
的{{1}}格式规范是标准的,自C90以来一直如此。
MSVC确实支持它。
您还可以使用格式规范提供字段宽度,以防止缓冲区溢出:
scanf()
另请注意,int main()
{
char buf[9];
scanf("%8[^\n]",buf);
printf("%s\n", buf);
printf("strlen(buf) == %u\n", strlen(buf));
return 0;
}
格式规范并不意味着"%["
支持正则表达式。那个特定的格式规范类似于正则表达式的能力(毫无疑问是受正则表达式的影响),但它比正则表达式更有限。