2016-04-17 34 views
1

私はlibsodiumライブラリを使ってペットプロジェクトに取り組んでおり、unsigned char *をchar *に変換するのが私の想像よりも単純ではありませんでした。また、最初にテストがリリースモードで合格していたので混乱していましたが、少し後にデバッグモードで渡されていないことがわかりました。 は、だから私は、次のを思い付いた:それは今のテストに合格している間"unsigned char *"を "char *"(そして文字列)に変換する

std::string string_from_uchar(const unsigned char * c, unsigned long long lc) 
    { 
     unsigned char * cc = new unsigned char[lc+1] ; 
     std::strncpy((char *) cc, (char *) c, lc); 
     cc[lc] = 0; 
     char* cr = reinterpret_cast<char *> (cc); 
     std::string ret(cr); 
     delete[](cr); 
     return ret; 
    } 

、私はそれが(例えば、それを行うための正しい方法であれば、誰かがチェックすることができれば感謝された希望のような別の環境でその仕事gccまたはclang?)

+4

'new'と' free() 'を混在させないでください。 –

+0

あなたのテストは全く異なる理由でテストに失敗したことがあり、実装した修正は修正するのではなく、根底にある問題を隠す回避策です。 – dasblinkenlight

+0

πάνταῥεῖ:良いキャッチ! –

答えて

5

あなたはこれを大いに考えています。

コピーは余分な動的割り当てとヌルターミネータの追加です(std::stringにはこの種の機会のための長さ引数を受け入れるコンストラクタがあるため)。

様々なcharはそう単純に、エイリアスを指定できます

std::string string_from_uchar(const unsigned char * c, unsigned long long lc) 
{ 
    return std::string(c, c + lc); 
} 

:あなたは範囲を取るコンストラクタを使用している場合

std::string string_from_uchar(const unsigned char * c, unsigned long long lc) 
{ 
    return std::string((const char*)c, lc); 
} 

実際には、あなたもキャストを必要としませんそれはそれ自身の機能であることをほとんど保証しない。

+0

私はちょうど 'キャストなしで' std :: string(c、c + lc) 'を行うことができると信じています。私が間違っているなら私を訂正してください。その獣を使ってからは長い時間が経ちました。 :) –

+3

その例をありがとう!あなたはちょうど 'c +' ;-)を忘れてしまった。ここで:http://coliru.stacked-crooked.com/a/14f4c576def38129 –

+0

@ Cheersandhth.-Alf:優秀! –

関連する問題