我需要读取一个字符串,直到写入以下序列: \nx\n :
(.....)\n
x\n
\n 是换行符, (.....) 可以是任何可能包含其他 \n 字符的字符。
据我所知,scanf 允许正则表达式,但在这种模式之前,我无法让它读取字符串。你能帮我处理scanf格式字符串吗?
我正在尝试类似的东西:
char input[50000];
scanf(" %[^(\nx\n)]", input);
但它不起作用。
scanf
据我所知,允许正则表达式
不幸的是,它不允许正则表达式:语法很接近,但在scanf
. 所有这些都支持正则表达式的字符类,因此%[<something>]
被隐式视为[<something>]*
. 这就是为什么您的调用scanf
转换为读取由 . 以外的字符组成的字符串'(', ')', 'x', and '\n'
。
为了解决您手头的问题,您可以设置一个循环来逐字符读取输入。每次你得到一个'\n'
,检查一下
'\n'
是'x'
, 和'x'
是另一个'\n'
如果以上所有都为真,那么您已经到达预期输入序列的末尾;否则,您的循环应该继续。
scanf
不支持正则表达式。它对字符类的支持有限,但这根本不是一回事。
永远不要使用scanf
, fscanf
, orsscanf
,因为:
%s
)是不安全的,其方式与不安全完全相同gets
,即它们会愉快地写到所提供缓冲区的末尾并导致程序崩溃。在这种情况下,您不需要正则表达式;一次读取一行,getline
并在读取的行只是“x”时停止。但是,标准(不是 ISO C,而是 POSIX)正则表达式库例程被称为regcomp
和regexec
.