C 查询字符串解析

标签 c string parsing query-string

我有以下查询字符串

address=1234&port=1234&username=1234&password=1234&gamename=1234&square=1234&LOGIN=LOGIN

我试图将其解析为不同的变量:地址、端口、用户名、密码、游戏名、方 block 和命令(将保存登录)

我正在考虑使用 strtok,但我认为它不会起作用。如何解析字符串以捕获变量?

P.S - 某些字段可能为空 - 未提供游戏名称或正方形

最佳答案

在解析分隔符之间可能包含空字段的字符串时,不能使用 strtok,因为 strtok 会将任意数量的连续分隔符视为单个分隔符。

因此,在您的情况下,如果 variable=values 字段还可能在 '&' 分隔符之间包含空字段,则必须使用 strsep 或其他函数,例如 strcspnstrpbrk 或简单的 strchr 以及几个用于沿着字符串进行操作的指针。

strsep 函数是 BSD 函数,可能不包含在您的 C 库中。 GNU 包含 strsep,它被设想为 strtok 的替代品,仅仅是因为 strtok 无法处理空字段。

(如果您没有可用的 strsep,则只需保留 startend 指针并使用类似 strchr 定位每次出现的 '&',将 end 指针设置为分隔符之前的 1,然后获取 var=value 来自 startend 指针之间的字符的信息,然后更新两者以指向超过分隔符并重复。)

在这里,您可以使用带有 "&\n" 分隔符的 strsep 来定位每个 '&'(包含 '\n' 字符,假定该行是从具有面向行的输入函数(例如 fgets 或 POSIX getline)的文件中读取的)。然后,您可以简单地调用 strtok 来使用 "="strsep 返回的每个标记中解析 var=value 文本> 作为分隔符(使用 strsep 解析时,'\n' 已从最后一个标记中删除)

插入特定空字段以在 "...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);
}

(注意: strsepchar** 参数作为其第一个参数,并将修改该参数以使其指向分隔符之后,因此您必须保留对原始分配字符串开头的引用(上面的查询)。

示例使用/输出

$ ./bin/strsep_query
address     1234
port        1234
username    1234
password    1234
gamename    1234
<empty field>
square      1234
LOGIN       LOGIN

(注意:“1234”转换为数值的工作已由您完成)

仔细检查一下,如果您还有其他问题,请告诉我。

关于C 查询字符串解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60134013/

相关文章:

html - C 中的匹配正则表达式

c - 嵌套结构/数组初始化

java - 在 Java 中将程序作为命令行参数运行时出现错误,如何解决此问题?

c - 递归函数中的逻辑错误

c++ - 函数错误中的数组字符串

c# - 读取文本文件并写入列表

Android动态显示图像

c - 直接返回结构体还是填充指针?

python - 在 python C API 中创建模块时如何包含 __build_class__

python - 有什么快速修改这种字典的方法吗?