8

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

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

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

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

提前致谢

4

3 回答 3

5

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

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

现在,如果你想这样做,scanf你可以尝试类似

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

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

不确定上述 scanf 是否会起作用,因为空格也与%s指令匹配。
我肯定会fgets打电话,然后用以下内容修剪周围的空格:如何以标准方式修剪前导/尾随空格?

于 2013-02-14T20:38:13.270 回答
3

重复使用 getc 是否有效?

在某种程度上取决于应用程序,但是YES,重复getc()是有效的。

于 2013-02-14T20:41:00.310 回答
1

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

于 2016-01-01T15:57:47.260 回答