将代码从Python转换为C ++

时间:2017-04-07 12:28:00

标签: python c++

现在当我理解代码是如何工作的时候,我想把它翻译成C ++。

原始Python代码:

def recv_all_until(s, crlf):
    data = ""
    while data[-len(crlf):] != crlf:
        data += s.recv(1)
    return data

这是我试过的:

std::string recv_all_until(int socket, std::string crlf)
{
    std::string data = "";
    char buffer[1];
    memset(buffer, 0, 1);


    while(data.substr(data.length()-2, data.length()) != crlf)
    {
        if ((recv(socket, buffer, 1, 0)) == 0)
        {
            if (errno != 0)
            {
                close(socket);
                perror("recv");
                exit(1);
            }
        }
        data = data + std::string(buffer);
        memset(buffer, 0, 1);
    }

    return data;
}

但它显示:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr

我理解问题出在while循环内部,因为最初数据字符串为空。那么如何改进它以使其工作与在Python中工作相同?谢谢。

2 个答案:

答案 0 :(得分:2)

while循环的第一次迭代中遇到问题:

由于data为空stringdata.length()等于0,因此您正在呼叫data.substr(-2, 0)

要解决此问题,您需要在while语句中添加行长度检查。

此外,有一种方法可以比编写有关它的stackoverflow问题更快地找到这样的错误。请考虑阅读this文章。

答案 1 :(得分:1)

如果我们先改变你的Python代码:

def recv_all_until(s, crlf):
    data = ""
    while not data.endswith(crlf):
        data += s.recv(1)
    return data

我们在C ++中需要做的事情变得更加清晰:

bool ends_with(const std::string& str, const std::string& suffix)
{
    return str.size() >= suffix.size() &&
        std::equal(suffix.rbegin(), suffix.rend(), str.rbegin());
}

std::string recv_all_until(int socket, const std::string& crlf)
{
    std::string data = "";
    char buffer[1];
    memset(buffer, 0, 1);

    while (!ends_with(data, crlf))
    {
        if ((recv(socket, buffer, 1, 0)) == 0)
        {
            if (errno != 0)
            {
                close(socket);
                perror("recv");
                exit(1);
            }
        }
        data = data + std::string(buffer);
        memset(buffer, 0, 1);
    }

    return data;
}