0

たとえば、実際に数字と、で区切られた文字列を含む文字列があり,ます"12,fooBar"

私はそれを分離された変数に入れたいと思います。つまり、数をunsigned int myNumに、文字列をに入れたいのstd::string myStrです。

私は次のコードを切り取っています:

size_t pos1=value.find(',');
std::cout << value.substr(0, pos1) << " and " 
          << (value.substr(0, pos1)).c_str() << std::endl;

これにより、が得られ12 and 1ます。ここで見逃したことはありますか?2第二部で何が起こったのですか?

:私はこの問題をこのコードの一部に限定しました。を取得するには、c_str()に渡す必要があります。ここでは、2番目の部分を印刷したくありません。atoiunsigend int

更新:私は実際にlevelDBから文字列を取得しますGet。ここに置いたようなテスト文字列を入れれば、うまくいきます。

4

4 に答える 4

5

投稿されたコードは、同じ部分文字列を生成します: value.substr(0, pos1). std::string::substr()はオブジェクトを変更しませんが、 new を返すことに注意してくださいstd::string

例:

#include <iostream>
#include <string>

int main ()
{
    std::string value ="12,fooBar";
    unsigned int myNum;
    std::string myStr;

    const size_t pos1 = value.find(',');    
    if (std::string::npos != pos1)
    {
        myNum = atoi(value.substr(0, pos1).c_str());
        myStr = value.substr(pos1 + 1);
    }

    std::cout << myNum << " and " 
              << myStr << std::endl;

    return 0;
}

出力:

12 と fooBar

編集:

unsigned intが必要な唯一の部分である場合、次のように動作します。

unsigned int myNum = atoi(value.c_str());

asatoi()は、最初の非数字文字 (オプションの先頭の-orを除く+) で停止します。この場合は,.

于 2012-02-29T14:32:47.767 に答える
3

この問題に対する最もクリーンな C++ スタイルの解決策は、文字列ストリームを使用することです。

#include <sstream>
// ...
std::string value = "12,fooBar";
unsigned int myNum;
std::string myStr;
std::stringstream myStream(value);
myStream >> myNum;
myStream.ignore();
myStream >> myStr;
于 2012-02-29T14:37:15.840 に答える
0

2 番目の substr は value.substr(pos1+1,value.length()) にする必要があります

于 2012-02-29T14:34:02.917 に答える