10

我需要读取一个字符串,直到写入以下序列: \nx\n :

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

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

据我所知,scanf 允许正则表达式,但在这种模式之前,我无法让它读取字符串。你能帮我处理scanf格式字符串吗?


我正在尝试类似的东西:

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

但它不起作用。

4

2 回答 2

23

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

不幸的是,它不允许正则表达式:语法很接近,但在scanf. 所有这些都支持正则表达式的字符类,因此%[<something>]被隐式视为[<something>]*. 这就是为什么您的调用scanf转换为读取由 . 以外的字符组成的字符串'(', ')', 'x', and '\n'

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

  • 到目前为止,您在输入中至少有三个字符,
  • 前面的字符'\n''x', 和
  • 之前的字符'x'是另一个'\n'

如果以上所有都为真,那么您已经到达预期输入序列的末尾;否则,您的循环应该继续。

于 2013-03-27T16:57:33.823 回答
13

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

永远不要使用scanf, fscanf, orsscanf,因为:

  1. 数值溢出会触发未定义的行为。允许 C 运行时仅仅因为某人输入了太多数字而使您的程序崩溃。
  2. 一些格式说明符(特别是%s)是不安全的,其方式与不安全完全相同gets,即它们会愉快地写到所提供缓冲区的末尾并导致程序崩溃。
  3. 它们使得稳健地处理格式错误的输入变得极其困难。

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

于 2013-03-27T17:00:00.257 回答