2012-02-29 18 views
0

実際に数字と文字列が,で区切られた文字列、たとえば"12,fooBar"があります。文字列(substrから)unsigned intへの変換

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番目の部分の2には何が起こりますか?

注::私はこの問題を、コードの断片に分割しました。私はunsigend intを得るためにatoiにそれを渡すためにc_str()が必要です。ここでは2番目の部分を印刷したくありません。

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

+0

あなたはそこにいなければなりません。 ([それは私のために働く](http://ideone.com/NoB87))問題を示す*完全* * *最小限のプログラムを提供してください。 http://sscce.org –

+0

@Robどのように動作するのですか?両方のsubstrsが同じ初期インデックスを使用しています。彼は決して入力の文字列部分に到達しません。 – Sid

+1

@Sid、このスニペットは文字列部分を取得するはずです。このコードスニペットは、 '12と12'を生成すると考えられています。 OPのメモを見てください。「atoiに渡すには '' c_str()が必要です」 –

答えて

5

投稿コードは、同じサブストリング:value.substr(0, pos1)を生成します。 std::string::substr()はオブジェクトを変更しませんが、新しい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に

EDIT:

unsigned intは、以下が動作しますし、必要な唯一の作品である場合:

として
unsigned int myNum = atoi(value.c_str()); 

この場合,で、(オプションリーディング-又は+除く)最初の非数字文字で停止します。

+0

あなたのEDITをありがとう。これは私に実際の問題を指摘した。 levelDBから得た文字列は、 '' ''の間に '1'と '2'の間にあり、atoiを失敗させます。ヒントをありがとう。私の問題の解決策ではなく、私の質問への答え;) – ezdazuzena

0

あなたの第二のsubstrは、この問題に対する(POS1 + 1、value.length())

4

クリーンなC++スタイルのソリューションはにstringstreamを使用することですvalue.substrする必要があります。

#include <sstream> 
// ... 
std::string value = "12,fooBar"; 
unsigned int myNum; 
std::string myStr; 
std::stringstream myStream(value); 
myStream >> myNum; 
myStream.ignore(); 
myStream >> myStr; 
+0

ストリームを使って作業を行うのが最善の答えです。私は1つのステートメントでそれを行い、無視されたcharがカンマであることを確認するためにテストしましたが。 –

+0

コンマを確認することに同意します。私はまた、すべてを一列に置いておきたいと思います。もちろん、この例を自由に編集することができます。また、編集の仕方を提案することもできます。 ようなもの: 'char separator; myStream >> myNum >> separator >> myStr; if(separator == 'c') // ... ' これはどういう意味ですか? – Agentlien

関連する問題