问题描述
我正在尝试拆分作为Web服务器响应的字符数组(POST请求)。我现在正在尝试提取主体并对其进行base64解码。我已经编写了两个函数来执行此操作:第一个函数返回一个整数,该整数说明使用带strtok的特定定界符可以将字符串拆分多少次,第二个函数返回拆分后的子字符串之一。我成功地从HTTP标头拆分了正文,但是在尝试接收可能的正文拆分量后,它返回0(因为strtok立即返回NULL)。我不明白为什么它不再起作用了,因为它在上面的几行中都可以正常工作。
用于拆分字符串的两个函数:
SELECT *
FROM
(
SELECT
uuid,FirsT_VALUE(order_number) OVER(
PARTITION BY uuid,order_id
ORDER BY
timestamp DESC
) AS order_number
FROM
order_items_changelog
-- WHERE order_date >= '2020-10-24' AND order_date < '2020-10-25' -- testing purposes
)
-- WHERE order_date >= '2020-10-24' AND order_date < '2020-10-25' -- testing purposes
GROUP BY
uuid,order_number;
我已经使用了以下功能:
int splitc(char* str,char* delim) {
char* t = (char*)malloc(stringlength(str) + 1);
lstrcpyA(t,str);
char* pch;
pch = strtok1(t,delim);
int i = 0;
while (pch != NULL)
{
i++;
pch = strtok1(NULL,delim);
}
return i;
}
char* splitnum(char* str,char* delim,int count) {
char* t = (char*)malloc(stringlength(str) + 1);
lstrcpyA(t,delim);
int i = 1;
while (pch != NULL)
{
if (i == count) {
return pch;
}
i++;
pch = strtok1(NULL,delim);
}
return (char*)"Na";
}
输出看起来像这样:
[...]
ret_connect = recv(client,rec,4000,0);
std::cout << "We received: " << rec << "\n" << std::endl;
int n = splitc(rec,(char*)"\n");
std::cout << "This response has lines: " << n << "\n" << std::endl;
char* ok = (char*)malloc(1000);
ok = splitnum(rec,(char*)"\n",n);
std::cout << "The last line is: " << ok << "\n" << std::endl;
int k = splitc(ok,(char*)"|"); //k is 0,but it should be 2
std::cout << "This line retuns results with delim | : " << k << std::endl;
对此输出的解释:前9行是Web服务器的响应。我使用winsocket函数recv(“ We received: HTTP/1.1 200 OK
Date: Mon,26 Oct 2020 13:48:09 GMT
Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1g PHP/7.2.33
X-Powered-By: PHP/7.2.33
Content-Length: 27
Connection: close
Content-Type: text/html; charset=UTF-8
XDNjeGNLUHI1NSJJdElEXA==|O
This response has lines: 9
The last line is: XDNjeGNLUHI1NSJJdElEXA==|O
This line retuns results with delim | : 0 //This is the error. splitc() should return 2 and not 0!
”)收到了此消息。现在,我用定界符“ \ n”调用第一个函数(splitc)。结果整数(n)告诉我响应有多少行。我知道最后一行(在本例中是第9行)是我的请求的正文。现在,我可以使用第一个函数的结果调用第二个函数(splitnum),以提取响应的最后一行。这项工作成功完成:“确定”现在包含请求的主体(XDNjeGNLUHI1NSJJdElEXA == | O)。现在,我想重复相同的过程以从“确定”中提取“ XDNjeGNLUHI1NSJJdElEXA ==“。我再次调用我的第一个函数,以使用定界符“ |”获得拆分数量。可以使用此定界符将字符串“ XDNjeGNLUHI1NSJJdElEXA == | O”拆分为2个部分,因此它应该返回2,但是由于某种原因它确实返回0。
我基本上是在尝试使用这两个函数替代std :: vector。如果我的输入字符串是向量,则我的第一个函数(splitc)应该返回数组大小,而我的第二个函数应返回“向量”中的指定元素。
我也在使用自定义的strtok函数,但是我认为这个函数不是问题,如果我也添加了这段代码,我认为这个问题会太长。它也必须用C编写,我仅将std用于调试目的。
我创建了一个最小的可复制示例:
ret_connect = recv(client,0);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)