【问题标题】:Use scanf with Regular Expressions将 scanf 与正则表达式一起使用
【发布时间】:2013-02-14 11:15:30
【问题描述】:

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

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

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

谁能详细解释scanf如何解释正则表达式?更何况,重复使用 getc 是否有效?

提前致谢:D

【问题讨论】:

  • 试试fgets()fgets(string, sizeof string, stdin);
  • 问题是任何剩余的字符都会留在输入流中,不是吗?
  • 如果有足够的空间,fgets() 会消耗所有内容,直到(包括)'\n'

标签: c unix scanf expression formatted-input


【解决方案1】:

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

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

现在,如果您想以scanf 的方式进行操作,您可以尝试类似

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

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

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

【讨论】:

  • 那么,毕竟没有其他方法可以丢弃任何剩余的输入吗?我考虑过重复使用 getc,保留我需要的字符数并丢弃字符串的其余部分,直到找到 \n 字符...
  • 我在您发表评论的同时编辑了我的答案。所以是的,可以忽略一些输入,但我不会将 scanf 格式字符串称为“正则表达式”。
  • 感谢您的回答!但是,你能解释一下你在那里使用的语义吗?
  • 感谢您的帮助!对此,我真的非常感激。 :D
  • 抱歉再次询问,但我测试了您提供的格式字符串,但没有结果。我试过这个代码:#include int main() { char sth[10], any[1024]; scanf("%*[ ]%9s%*[ ]\n", sth); printf("1%s", sth);获取字符(); scanf("%s", 任意); printf("2%s", 任意);返回0;尝试使用“其他任何东西”作为输入。你得到“12nything”而不是“1anything 2”......
【解决方案2】:

重复使用 getc 是否有效?

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不需要%[^'\n']s 中的s
    猜你喜欢
    • 2015-12-18
    • 2016-12-29
    • 2011-06-19
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多