C查询字符串解析

C查询字符串解析,c,string,parsing,query-string,C,String,Parsing,Query String,我有以下查询字符串 address=1234&port=1234&username=1234&password=1234&gamename=1234&square=1234&LOGIN=LOGIN 我试图将其解析为不同的变量:地址、端口、用户名、密码、游戏名、square和command(用于保存登录名) 我曾想过使用strtok,但我认为它行不通。如何解析字符串以捕获变量 另外,一些字段可能是空的-没有提供游戏名或是方形的当解析可能在分隔符之间

我有以下查询字符串

address=1234&port=1234&username=1234&password=1234&gamename=1234&square=1234&LOGIN=LOGIN
我试图将其解析为不同的变量:地址、端口、用户名、密码、游戏名、square和command(用于保存登录名)

我曾想过使用strtok,但我认为它行不通。如何解析字符串以捕获变量


另外,一些字段可能是空的-没有提供游戏名或是方形的

当解析可能在分隔符之间包含空字段的sting时,
strtok
不能使用,因为
strtok
将把任意数量的顺序分隔符视为单个分隔符

因此,在您的情况下,如果variable=values字段也可能在
”和“
分隔符之间包含一个空字段,则必须使用
strep
,或其他函数,如
strcspn
strpbrk
,或简单地使用
strhr
和两个指针来处理字符串

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

(如果您没有可用的
strep
,则只需保留一个开始和结束指针,并使用类似
strhr
的函数来定位
&
的每个匹配项,将结束指针设置为分隔符之前的一个,然后从开始和结束指针之间的字符中获取var=值信息,然后向上)将两者都定为越过分隔符的点,并重复。)

在这里,您可以使用分隔符为
“&\n”
strsep
来定位每个
”和“
”(包含的
'\n'
字符假定该行是从具有面向行的输入函数(如
fgets
或POSIX
getline
)的文件中读取的)。然后,您只需调用
strtok
即可解析
stresp
返回的每个标记的var=value文本,使用
“=”
作为分隔符(使用
stresp
解析时,
'\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);
}
注意:
“1234”
转换为数值的操作留给了您)


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

使用
strtok
使用
strtok
&
拆分,然后使用
strchr
查找令牌中的
=
。您真的是J Doe吗?如果存在空字段的可能性(例如
“&&&&&
),则
strtok
无法使用(它将连续分隔符视为单个分隔符)。但是,您可以使用
strep
strcspn
strpbrk
通过定位分隔符来处理空字段。在这里,您可以在
strep
调用中嵌套
strok
,以使用
“&\n”
作为
strep
的分隔符,然后调用
strtok
,使用
“=\n”
作为分隔符来分隔
var=value
部分。嗯,为什么
strdup
要单独处理数组?也许你的意思是
char*query=strdup(getenv(“query\u STRING”))
或类似的ooof..好问题。我必须试着回忆一下我的思考过程。我相信目的是从问题中提取查询字符串,并将其复制成可由
stresp使用的形式--我不确定问题是否涉及当前用户的信息(至少这是我能回忆起的最好的信息)另外,我不认为通常会有空的名称-值对,但是没有
foo=1&bar&baz=2
的名称是可能的,同样的名称也可能出现多次。是的,这很有意义。我确实记得
foo=42&bar=&baz=2
;一些字段可能是空的
在这个问题中,如果OP的意思是
“…&gamename=&square…”
而不是
“…&&…”
,那么
strtok
就可以了。很好地理解了这个歧义,我从来没有想过其他解释。(直到现在)
$ ./bin/strsep_query
address     1234
port        1234
username    1234
password    1234
gamename    1234
<empty field>
square      1234
LOGIN       LOGIN