在编写以下序列之前,我需要读取一个字符串:\ nx \ n:(.....)\nx\n\ n是换行符,并且(.....)可以是任何可能包含其他\ n字符的字符。据我所知,scanf允许使用正则表达式,但是直到此模式,我才能使其读取字符串。您能为我提供scanf格式字符串吗?我正在尝试类似的东西:char input[50000];scanf(" %[^(\nx\n)]", input);但这不起作用。
2 回答
阿波罗的战车
TA贡献1862条经验 获得超6个赞
scanf
据我所知允许正则表达式
不幸的是,它不允许使用正则表达式:语法误导性很强,但是在实现中甚至没有与regex相似的东西scanf
。所有这些都支持正则表达式的字符类,因此%[<something>]
将其隐式视为[<something>]*
。这就是为什么您将scanf
Translation 调用转换为读取由以外的字符组成的字符串的原因'(', ')', 'x', and '\n'
。
为了解决您眼前的问题,您可以设置一个循环,逐个读取输入的字符。每次获得时'\n'
,请检查
到目前为止,您输入的内容中至少包含三个字符,
紧接其前的字符
'\n'
是'x'
,并且那之前的角色
'x'
是另一个'\n'
如果以上所有条件均成立,则您已到达预期输入序列的末尾;否则,您的循环应继续。
白衣染霜花
TA贡献1796条经验 获得超10个赞
scanf
不支持正则表达式。它对字符类的支持有限,但这完全不是一回事。
请勿使用scanf
,fscanf
或sscanf
,因为:
数字溢出会触发未定义的行为。仅由于有人键入太多数字,才允许C运行时使程序崩溃。
某些格式说明符(尤其是
%s
)是不安全的,与gets
不安全的方式完全相同,即它们会欣喜地写入所提供缓冲区的末尾,并使程序崩溃。它们使得很难可靠地处理格式错误的输入。
在这种情况下,您不需要正则表达式;一次读取一行,getline
并在行读取仅为“ x”时停止。但是,标准正则表达式库例程(不是ISO C,而是POSIX)称为regcomp
和regexec
。
- 2 回答
- 0 关注
- 894 浏览
添加回答
举报
0/150
提交
取消