gpt4 book ai didi

另一个解析器中的 C 字符串解析器

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:35 26 4
gpt4 key购买 nike

我有以下字符串:

GET /index.html HTTP/1.0;;User-Agent: Wget/1.11.4;;Accept: */*;;Host: www.google.com;;Connection

我使用下面的代码来解析每个元素:

    while (parser != NULL){
printf ("%s\n",parser);
parser = strtok (NULL, ";;");
}

这个输出:

GET /index.html HTTP/1.0
User-Agent: Wget/1.11.4
Accept: */*
Host: www.google.com
Connection

现在我只需要获取主机网址,在本例中为 www.google.com。所以首先我想把它和其他东西分开。

为此,我将另一个解析器放入我之前的解析器中,如下所示:

    while (parser != NULL){
char * pars = strtok (string,":");
while (pars != NULL) {
printf("%s\n", pars);
pars = strtok (NULL, ":");
}
parser = strtok (NULL, ";;");
}

这个输出是一些乱七八糟的东西。我不明白为什么......任何人都可以看到错误吗?谢谢

最佳答案

您的代码不起作用的原因是 strtok 是不可重入的。因为该函数使用静态变量来保存状态(这就是让您以 NULL 作为第一个参数调用 strtok 的原因),您无法设置 strtok< 的调用 在嵌套循环中:一旦您告诉 strtok 使用 ":" 定界符进行解析,它就会“忘记”使用 ";"< 进行解析的状态 分隔符。

切换到 strtok 的可重入版本 - strtok_r , 将解决此问题。此函数需要您提供一个额外的参数,savePtr。重要提示:您需要为内部和外部循环中的 strtok_rsavePtr 提供两个不同的变量,否则代码会表现出相同的行为。

注意:strtok_r 不是 C 标准的一部分。但是,大多数流行的 C 库都提供它。如果您的库没有 strtok_r,找到它的源代码,并将其添加到您自己的代码库中。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com