[英]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
)读取整行,然后适当地解析它。 带有%n
或strtok
sscanf
可能有用,但您也可以“手动”解析该行(考虑使用例如您的递归下降解析器)。 您也可以使用strchr
或strstr
。
顺便说一句,在许多情况下,使用常见的文本表示形式(如JSON 、 YAML 、 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.