我有以下查询字符串
address=1234&port=1234&username=1234&password=1234&gamename=1234&square=1234&LOGIN=LOGIN
我正在尝试将其解析为不同的变量:地址、端口、用户名、密码、游戏名、正方形和命令(将保存 LOGIN)
我正在考虑使用 strtok,但我认为它行不通。如何解析字符串以捕获变量?
PS - 一些字段可能是空的 - 没有提供游戏名称或正方形
我有以下查询字符串
address=1234&port=1234&username=1234&password=1234&gamename=1234&square=1234&LOGIN=LOGIN
我正在尝试将其解析为不同的变量:地址、端口、用户名、密码、游戏名、正方形和命令(将保存 LOGIN)
我正在考虑使用 strtok,但我认为它行不通。如何解析字符串以捕获变量?
PS - 一些字段可能是空的 - 没有提供游戏名称或正方形
解析可能在分隔符之间包含空字段的字符串时,strtok不能使用,因为strtok会将任意数量的连续分隔符视为单个分隔符。
因此,在您的情况下,如果variable=values字段也可能在分隔符之间包含一个空字段'&',则您必须使用strsep, 或其他函数,例如strcspn,strpbrk或简单地strchr使用几个指针来沿着字符串向下工作。
该strsep函数是 BSD 函数,可能不包含在您的 C 库中。GNU 包含strsep并被设想为strtok简单的替代品,因为strtok它不能处理空字段。
(如果你没有strsep可用的,你只需要保留一个开始和结束指针,并使用一个函数strchr来定位每次出现'&'将结束指针设置为分隔符之前的一个,然后从之间的字符中获取var=value信息开始和结束指针,然后将两者都更新为指向分隔符并重复。)
在这里,您可以使用strsep分隔符 of"&\n"来定位每个'&'(假设该行是从具有面向行的输入函数(例如POSIX 或 POSIX )'\n'的文件中读取的假设行包含的字符)。然后,您可以简单地调用以从使用作为分隔符返回的每个标记中解析var=value文本(使用解析时已从最后一个标记中删除)fgetsgetlinestrtokstrsep"="'\n'strsep
插入特定空字段以在 之间进行处理的示例"...gamename=1234&&square=1234..."如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
char array[] = "address=1234&port=1234&username=1234&password=1234"
"&gamename=1234&&square=1234&LOGIN=LOGIN",
*query = strdup (array), /* duplicate array, &array is not char** */
*tokens = query,
*p = query;
while ((p = strsep (&tokens, "&\n"))) {
char *var = strtok (p, "="),
*val = NULL;
if (var && (val = strtok (NULL, "=")))
printf ("%-8s %s\n", var, val);
else
fputs ("<empty field>\n", stderr);
}
free (query);
}
(注意: strsep将char**参数作为其第一个参数,并将修改参数以指向分隔符,因此您必须保留对原始分配字符串开头的引用(query上面))。
示例使用/输出
$ ./bin/strsep_query
address 1234
port 1234
username 1234
password 1234
gamename 1234
<empty field>
square 1234
LOGIN LOGIN
(注意:转换为"1234"数值的工作留给您)
如果您还有其他问题,请仔细查看并告诉我。