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

时间:2017-10-26 03:21:53

标签: c string scanf

有没有办法将字符串用作分隔符? 我们可以使用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 as delimiters ..不一定用sscanf。 更新:解决方案不一定需要使用C语言。我只想知道一种使用字符串作为分隔符的方法

1 个答案:

答案 0 :(得分:1)

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

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

您可以使用getline(或者fgets)读取整行,然后适当地解析它。使用%nsscanfstrtok可能会有用,但您也可以手动解析该行" (考虑使用例如recursive descent parser)。您也可以使用strchrstrstr

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

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

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

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

所以你想要达到的目标是很容易做到和标准练习。但是你需要更多sscanf,你可能想要结合几件事。

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

如果您不熟悉常用的解析技巧,阅读一本好书,例如 Dragon Book 。大多数大型程序都处理解析,所以你需要知道如何做到这一点。