我需要读取一个字符串,直到出现以下序列为止:\nx\n :
(.....)\n
x\n
\n是换行符,而(...)可以包含其他\n字符的任意字符。
据我所知,scanf允许使用正则表达式,但我无法使其读取字符串直到该模式。你能帮我设计scanf格式字符串吗?
我尝试了以下格式:
char input[50000];
scanf(" %[^(\nx\n)]", input);
但是它不起作用。
我需要读取一个字符串,直到出现以下序列为止:\nx\n :
(.....)\n
x\n
\n是换行符,而(...)可以包含其他\n字符的任意字符。
据我所知,scanf允许使用正则表达式,但我无法使其读取字符串直到该模式。你能帮我设计scanf格式字符串吗?
我尝试了以下格式:
char input[50000];
scanf(" %[^(\nx\n)]", input);
但是它不起作用。
scanf
不允许正则表达式。不幸的是,虽然其语法非常类似于正则表达式,但在scanf
的实现中根本没有任何与正则表达式相似的东西。它只支持正则表达式的字符类,因此%[<something>]
会被隐式地处理为[<something>]*
。这就是为什么你调用scanf
会被解释为读取一个由除了'(', ')', 'x', 和 '\n'
之外的字符组成的字符串。'\n'
时,检查以下几点:
'\n'
之前的字符是一个'x'
;'x'
之前的字符是另一个'\n'
scanf
不支持正则表达式。 它对字符类有限支持,但这完全不同。
永远不要使用 scanf
, fscanf
, 或 sscanf
,因为:
%s
)与 gets
一样不安全,即它们会愉快地写入超过提供的缓冲区的末尾并使您的程序崩溃。对于此案例,您不需要正则表达式;使用getline
每次读取一行,并在读取的行只是 "x" 时停止。然而,标准(不是ISO C,而是POSIX)正则表达式库的例程称为regcomp
和 regexec
。