C:通过定界符分割char *的自定义函数突然停止工作

问题描述

我正在尝试拆分作为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 (将#修改为@)