在解析可能包含分隔符之间的空字段的字符串时,不能使用strtok,因为strtok 会将任意数量的连续分隔符视为单个分隔符。
因此,在您的情况下,如果 variable=values 字段还可能在 '&' 分隔符之间包含一个空字段,则您必须使用 strsep 或其他函数,例如 strcspn , strpbrk 或简单的 strchr 和几个指针,可以沿着字符串向下工作。
strsep 函数是一个 BSD 函数,可能不包含在您的 C 库中。 GNU 包含strsep,它被设想为strtok 的替代品,仅仅是因为strtok 不能处理空字段。
(如果您没有可用的strsep,您只需保留一个start 和end 指针并使用strchr 之类的函数来定位每个发生'&' 将end 指针设置为分隔符前1,然后从start 和var=value 信息em>end 指针,然后将两者都更新为指向分隔符并重复。)
在这里,您可以使用带有"&\n" 分隔符的strsep 来定位每个'&'(假设该行是从具有面向行的文件中读取的,则包含'\n' 字符> 输入函数如fgets 或POSIX getline)。然后,您可以简单地调用 strtok 来解析 strsep 返回的每个令牌中的 var=value 文本,使用 "=" 作为分隔符('\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" 转换为数值的工作由您完成)
检查一下,如果您还有其他问题,请告诉我。