scanf函数的正则表达式 - Ç(scanf regex - C)

2019-07-28 14:10发布

我需要读取一个字符,直到下列顺序写入:\ NX \ N:

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

\ n是新行字符和(.....)可以是可以包括其它\ n个字符的任何字符。

scanf函数允许正则表达式,据我知道,但我不能使它读取字符串,直到这个模式。 你能不能帮我scanf格式串中?


我是想是这样的:

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

但它不工作。

Answer 1:

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

不幸的是,它不允许正则表达式:语法是误导接近,但并没有什么甚至远程类似于实施正则表达式scanf 。 所有这一切的存在是一个支持字符类正则表达式,那么%[<something>]被隐含当作[<something>]* 。 这就是为什么你的通话scanf转化成阅读由比其他字符的字符串'(', ')', 'x', and '\n'

为了解决在手你的问题,你可以设置一个循环,读取字符输入字符。 每当你得到一个'\n' ,检查

  • 你必须输入至少三个字符,你已经迄今为止看到,
  • 这之前的字符'\n'是一个'x' ,并
  • 这在之前的字符'x'是另一个'\n'

如果所有上述是真实的,你已经达到了预期的输入序列的结束; 否则,你的循环应该继续。



Answer 2:

scanf 支持正则表达式。 它有一个字符类有限的支持,但是这不是在所有同样的事情。

切勿使用scanffscanfsscanf ,这是因为:

  1. 数字溢出触发未定义行为 。 C运行时允许你的程序崩溃 ,只是因为有人键入数字太多。
  2. 一些格式说明(尤其是%s )是不安全的完全相同的方式gets是不安全的,即它们会乐呵呵地写过去所提供的缓冲区的结束和你的程序崩溃。
  3. 他们把它极难可靠地处理畸形输入。

你不需要对这种情况下的正则表达式; 在与时间读取一行getline ,当读行只是“X”停止。 但是,标准(ISO不C,但是POSIX)正则表达式库函数调用regcompregexec



文章来源: scanf regex - C
标签: c regex scanf