【发布时间】:2016-08-07 21:06:49
【问题描述】:
我如何解析这个字符串GET /STA/ID=HelloWorld/Pass=Testin123 HTTP/1.1首先我需要检查STA,如果存在,继续扫描字符串。将ID 的值在这种情况下HelloWorld 应该存储在char 数据类型SSID 和Pass 的值中,在这种情况下Testin123 应该存储在char 数据类型Pass 中
它应该首先确认字符串中STA 的存在。如果不存在,则不要进入循环。如果退出,请搜索 ID 和 Pass。存储它。
现在的问题是我无法存储 ID 和 pass 的值。也无法搜索STA。
char GetString[] = "GET /STA/ID=Test/Pass=123 HTTP/1.1";
char *get = strtok(GetString, " ");
char *request = strtok(NULL, " ");
char *rtype = strtok(NULL, " ");
char *FirstPart;
int main()
{
if (request != NULL)
{
FirstPart = strtok(request,"/");
while(FirstPart)
{
if (!strncmp(part, "STA"))
{
//Print STA Found
if(!strncmp(part, "ID=", 3))
{
//Store value of ID
}
if(!strncmp(part, "Pass=", 5))
{
//Store the Pass
}
}
}
FirstPart =strtok(NULL,'/');
}
}
【问题讨论】:
-
这是一个奇怪的地方停下来,你得到了正确的标记,但没有用 strcmp 测试字符串是否相等?
-
@covener 我已经添加了完整的代码。
-
问题是小错误隐藏了你的大错误。对 strncmp 的调用无效,没有长度参数。使用第二个字符参数对 strtok 进行了无效调用,该参数应该是一个字符串。您的 while 循环正在遍历令牌,但仅当该令牌是“STA”时才执行任何操作,但如果是,则检查它是否是其他东西,但您知道它是“STA”,因此其他 if 子句永远无法匹配.
-
这是一个学校项目吗?如果是,请忽略我的评论。
strtok不是线程安全的。如果您正在运行并发 Web 服务器,您可能会遇到难以通过这种方式调试问题。我会尽可能避免使用这些功能。我也会考虑为此使用现有的库,编写糟糕的自定义解析器的成本可能高于事后审查完全解析的 HTTP 请求的成本。 -
@Myst 不,这不是学校项目。我需要可靠的解析字符串的方法。图书馆的任何链接都会有很大帮助!