2017-04-07 118 views
2

现在,当我了解代码的工作原理时,我想将其转换为C++。将代码从Python转换为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一样工作呢?谢谢。

+1

仅供参考,Python字符串有这使得该方法'endswith'你的while循环意图更清晰:'while data.endswith(crlf)'。考虑到这一点,[此SO回答](http://stackoverflow.com/a/2072890/4859885)为您提供了一个非常优雅的解决方案。 –

回答

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; 
} 
2

您的while循环的第一次迭代的问题:

由于data是空stringdata.length()等于0,因此你打电话data.substr(-2, 0)

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

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