scanf正则expression式 – C

我需要阅读一个string,直到下面的序列被写入:\ nx \ n:

(.....)\n x\n 

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

scanf允许正则expression式,据我所知,但我不能让它读取一个string,直到这种模式。 你能帮我使用scanf格式的string吗?


我正在尝试像这样的东西:

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

但它不起作用。

就我所知, scanf允许正则expression式

不幸的是,它不允许正则expression式:语法误导性地接近,但是在scanf的实现中甚至没有任何东西与正则expression式类似。 所有这些都支持正则expression式的字符类 ,所以%[<something>]被隐式地视为[<something>]* 。 这就是为什么你的scanf调用转换为读取由'(', ')', 'x', and '\n'以外的字符组成的string。

为了解决您手头的问题,您可以设置一个循环来逐字读取input字符。 每次你得到一个'\n' ,检查

  • 您至今在input中至less有三个字符,
  • '\n'之前的字符是'x' ,而
  • 'x'之前的字符是另一个'\n'

如果以上所有内容都是正确的,那么您已经达到了预期的input序列的结尾; 否则,你的循环应该继续。

scanf 支持正则expression式。 它对angular色类的支持有限,但这不完全相同。

切勿使用scanffscanfsscanf ,因为:

  1. 数字溢出触发未定义的行为 。 C运行时被允许崩溃你的程序,只是因为有人键入了太多的数字。
  2. 一些格式说明符(特别是%s )是不安全的,完全相同的方式是不安全的,也就是说,他们会愉快地写入超过提供的缓冲区的末尾,并使程序崩溃。
  3. 它们使得处理格式错误的input非常困难。

这个情况你不需要正则expression式。 用getline一次读取一行,并在读取的行只是“x”时停止。 但是,标准(不是ISO C,而是POSIX)正则expression式库例程称为regcompregexec