繁体   English   中英

C语言。 如何在 SSCANF 中使用字符串值作为分隔符

[英]C Language. How to use a string value as delimiter in SSCANF

有没有办法使用字符串作为分隔符? 我们可以使用字符作为分隔符使用 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 语言。 我只想知道一种使用字符串作为分隔符的方法

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

您的输入语言(您尚未在问题中定义)似乎类似于HTTP POST请求中使用的MIME类型application/x-www-form-urlencoded 因此,您可能至少会寻找与 HTTP 服务器处理(如libonion )和 HTTP 客户端处理(如libcurl )相关的免费软件库的源代码,以获得灵感。

您可以使用getline (或者可能是fgets )读取整行,然后适当地解析它。 带有%nstrtok sscanf可能有用,但您也可以“手动”解析该行(考虑使用例如您的递归下降解析器)。 您也可以使用strchrstrstr

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

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

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

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

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

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

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

如果您不熟悉通常的解析技术,请阅读一本好书,例如龙之书》 大多数大型程序在某处处理解析,因此您需要知道如何完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM