将scanf与正则表达式一起使用

时间:2013-02-14 11:15:30

标签: c unix scanf expression formatted-input

我一直在尝试在scanf上使用正则表达式,以便读取最多n个字符的字符串并丢弃其他任何内容,直到新行字符。任何空格都应被视为常规字符,因此包含在要读取的字符串中。 我研究过一篇关于正则表达式的维基百科文章,但我无法让scanf正常工作。这是我尝试过的一些代码:

scanf("[ ]*%ns[ ]*[\n]", string);

[]应该用于实际的空格字符,*应该表示一个或多个,n是要读取的字符数,string是用malloc分配的指针。 我尝试了几种不同的组合;但是我倾向于只获得一个句子的第一个单词(停留在空格中)。此外,*似乎丢弃了一个字符,而不是意味着“零或更多”......

有人能详细解释一下scanf如何解释正则表达式?更重要的是,重复使用getc是否有效?

先谢谢你:D

3 个答案:

答案 0 :(得分:5)

简短回答:scanf从字面上讲不会处理正则表达式。

如果要在C中使用正则表达式,可以使用正则表达式POSIX库。有关此库使用的基本示例,请参阅以下问题:Regular expressions in C: examples?

现在,如果你想以scanf的方式做到这一点,你可以试试

scanf("%*[ ]%ns%*[ ]\n",str);

n中的%ns替换为要从输入流中读取的最大字符数。 %*[ ]部分要求忽略任何空格。您可以将*替换为特定数字,以忽略精确的字符数。您可以在大括号之间添加其他字符,以忽略多个空格。

不确定上述scanf是否有效,因为空格也与%s指令匹配 我肯定会进行fgets调用,然后使用以下内容调整周围的空格:How do I trim leading/trailing whitespace in a standard way?

答案 1 :(得分:3)

  

重复使用getc是否有效?

取决于应用程序,但,重复getc()效率很高。

答案 2 :(得分:1)

除非我读错了这个问题,%[^' \ n'] s会保存所有内容,直到遇到回车。