2017-04-07 23 views
2

コードの仕組みを理解したら、C++に翻訳したいと思います。コードをPythonからC++に翻訳する

オリジナルのPythonコード:

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

しかし、それは示しています:

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

は、ここに私が試したものだ

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

私は問題があるためwhileループ内であることを理解します最初はデータ文字列は空です。では、Pythonで動作するようにこれを改善する方法は?ありがとうございました。

+1

、Pythonの文字列は作る方法 'endswith'を持っていますあなたのwhileループの意図はもっとはっきりしています: 'not data.endswith(crlf)'。そのことを念頭に置いて、[このSO答え](http://stackoverflow.com/a/2072890/4859885)は非常に洗練されたソリューションを提供します。 –

答えて

1

我々が最初にあなたのPythonコードビットを変更した場合:我々はC++で行うに必要なもの

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

がより明確になった:

FYI
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が空stringあるので

を、data.length()0に等しく、したがって、あなたはdata.substr(-2, 0)を呼んでいます。

これを修正するには、行の長さのチェックをwhileステートメントに追加する必要があります。

また、このような間違いを見つけ出す方法は、それについてのstackoverflow質問を書くよりも速いです。記事thisを読むことを検討してください。

関連する問題