我一直在尝试在scanf上使用正则表达式,以便读取最多n个字符的字符串并丢弃其他任何内容,直到新行字符。任何空格都应被视为常规字符,因此包含在要读取的字符串中。 我研究过一篇关于正则表达式的维基百科文章,但我无法让scanf正常工作。这是我尝试过的一些代码:
scanf("[ ]*%ns[ ]*[\n]", string);
[]应该用于实际的空格字符,*应该表示一个或多个,n是要读取的字符数,string是用malloc分配的指针。 我尝试了几种不同的组合;但是我倾向于只获得一个句子的第一个单词(停留在空格中)。此外,*似乎丢弃了一个字符,而不是意味着“零或更多”......
有人能详细解释一下scanf如何解释正则表达式?更重要的是,重复使用getc是否有效?
先谢谢你:D
答案 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会保存所有内容,直到遇到回车。