【问题标题】:C Language. How to use a string value as delimiter in SSCANFC 语言。如何在 SSCANF 中使用字符串值作为分隔符
【发布时间】:2017-10-26 03:21:52
【问题描述】:

有没有办法使用字符串作为分隔符? 我们可以使用 sscanf() 将字符作为分隔符;

示例 我有 char url[]="username=jack&pwd=jack123&email=jack@example.com"

我可以使用。 char username[100],pwd[100],email[100]; sscanf(url, "username=%[^&]&pwd=%[^&]&email=%[^\n]", username,pwd,email);

它适用于这个字符串。但对于 url="username=jack&jill&pwd=jack&123&email=jack@example.com"

它不能被使用...它可以删除 SQL 注入...但我想学习一个使用技巧 &pwd,&email 作为分隔符..不一定使用 sscanf。 更新:解决方案不一定需要使用 C 语言。我只想知道一种使用字符串作为分隔符的方法

【问题讨论】:

  • 这就是 URL-encoding 的原因之一。确保没有按原样在 URL 中输入特殊字符。问题可以解决,但并不像单个sscanf 调用甚至使用strtok 或正则表达式那么简单。
  • 我确实使用了一个函数来解析和添加转义字符,就像删除 SQL 注入的常用方法一样......但我希望有办法使用字符串作为分隔符,这样可以节省很多时间..我可能会做一个自定义功能,但不确定。 .我想知道 C 或任何其他语言是否有可能

标签: c string scanf


【解决方案1】:

只需编写您自己的parsing。在许多情况下,在内存中表示您已解析的AST 很有用。但请指定并记录您的输入语言(可能使用EBNF 表示法)。

您的输入语言(您没有在问题中定义)似乎类似于HTTP POST 请求中使用的MIME 类型application/x-www-form-urlencoded。因此,至少为了获得灵感,您可能会查看与 HTTP 服务器处理(如 libonion)和 HTTP 客户端处理(如 libcurl)相关的 free software 库的源代码。

你可以用getline(或者fgets)读一整行,然后适当地解析它。 sscanf%nstrtok 可能有用,但您也可以“手动”解析该行(考虑使用例如您的 recursive descent parser)。您也可以使用strchrstrstr

顺便说一句,在许多情况下,使用常见的文本表示形式,如 JSONYAML,XML 会很有帮助,您可以轻松找到许多库来处理它们。

另请注意,字符串可以使用fmemopen 和/或open_memstream 处理为FILE*

您可以使用解析器生成器,例如 bison(与 flex)。

在某些情况下,正则表达式可能很有用。见regcomp 和朋友们。

因此,您想要实现的目标很容易做到并且是标准做法。但是您需要的不仅仅是sscanf,而且您可能想要结合几件事情。

许多外部库(例如来自 GTK 的 glib)提供了一些解析。你应该关心 UTF-8(今天,你有 UTF-8 everywhere)。

在 Linux 上,如果允许这样做,当您需要交互式输入(具有编辑能力和自动完成功能)时,您可以使用 GNU readline 而不是 getline。然后从GNU bash(或RefPerSys,如果对C++ 感兴趣)的源代码中获取灵感。

如果您不熟悉常用的解析技术,请阅读一本好书,例如 Dragon Book。大多数大型程序都会在某个地方处理解析,因此您需要知道如何完成。

【讨论】:

  • 是的,我想创建一个函数来替换上述函数中的 sscanf,我可以做到,特别是因为 url 是固定的,所以很容易这样做..i
  • 所以只需编写代码,没什么大不了的。但是一定要花几天时间阅读有关解析(和编译)的书籍。它们是成熟的技术。
  • 在 POSIX 和 awk 中可以使用字符串作为分隔符。所以我希望 C 也可以实现类似的东西
  • 标准 C 提供有限的字符串处理,但自己编写或查找一些外部库是很常见的做法。顺便说一句,gawk 是用 C 编码的 free software,因此您可以研究它的源代码并从中获得启发。
  • C 中的大多数大型程序都有一些内部解析。这就是为什么阅读一本关于解析的好书如此重要的原因。已有成熟的技术。
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
相关资源
最近更新 更多