现在当我理解代码是如何工作的时候,我想把它翻译成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中工作相同?谢谢。
答案 0 :(得分:2)
在while
循环的第一次迭代中遇到问题:
由于data
为空string
,data.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;
}