为了账号安全,请及时绑定邮箱和手机立即绑定

scanf正则表达式-C

/ 猿问

scanf正则表达式-C

慕函数4003404 2019-12-06 09:59:25

在编写以下序列之前,我需要读取一个字符串:\ nx \ n:


(.....)\n

x\n

\ n是换行符,并且(.....)可以是任何可能包含其他\ n字符的字符。


据我所知,scanf允许使用正则表达式,但是直到此模式,我才能使其读取字符串。您能为我提供scanf格式字符串吗?


我正在尝试类似的东西:


char input[50000];

scanf(" %[^(\nx\n)]", input);

但这不起作用。


查看完整描述

2 回答

?
阿波罗的战车

scanf 据我所知允许正则表达式

不幸的是,它不允许使用正则表达式:语法误导性很强,但是在实现中甚至没有与regex相似的东西scanf。所有这些都支持正则表达式的字符类,因此%[<something>]将其隐式视为[<something>]*。这就是为什么您将scanfTranslation 调用转换为读取由以外的字符组成的字符串的原因'(', ')', 'x', and '\n'

为了解决您眼前的问题,您可以设置一个循环,逐个读取输入的字符。每次获得时'\n',请检查

  • 到目前为止,您输入的内容中至少包含三个字符,

  • 紧接其前的字符'\n''x',并且

  • 那之前的角色'x'是另一个'\n'

如果以上所有条件均成立,则您已到达预期输入序列的末尾;否则,您的循环应继续。


查看完整回答
反对 回复 2019-12-06
?
白衣染霜花

scanf 支持正则表达式。它对字符类的支持有限,但这完全不是一回事。

请勿使用scanffscanfsscanf,因为:

  1. 数字溢出会触发未定义的行为。仅由于有人键入太多数字,才允许C运行时使程序崩溃

  2. 某些格式说明符(尤其是%s)是不安全的,与gets不安全的方式完全相同,即它们会欣喜地写入所提供缓冲区的末尾,并使程序崩溃。

  3. 它们使得很难可靠地处理格式错误的输入。

在这种情况下,您不需要正则表达式;一次读取一行,getline并在行读取仅为“ x”时停止。但是,标准正则表达式库例程(不是ISO C,而是POSIX)称为regcompregexec


查看完整回答
反对 回复 2019-12-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信