gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:54:01 27 4
gpt4 key购买 nike

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

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

我可以使用。字符用户名[100],密码[100],电子邮件[100];
sscanf(url, "用户名=%[^&]&密码=%[^&]&电子邮件=%[^\n]", 用户名,密码,电子邮件);

对于这个字符串来说效果很好。但对于url="username=jack&jill&pwd=jack&123&email=jack@example.com"

它不能用来...它可以消除 SQL 注入(inject)...但我想学习一个使用技巧&pwd,&email 作为分隔符..不一定与 sscanf 一起使用。更新:解决方案不一定需要使用 C 语言。我只想知道如何使用字符串作为分隔符

最佳答案

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

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

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

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

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

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

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

所以你想要实现的目标很容易做到并且是标准实践。但您需要的不仅仅是 sscanf您可能想结合几件事。

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

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

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

关于C语言。如何在 SCANF 中使用字符串值作为分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46945358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com