2016-10-07 10 views
-1

文字列から数値を読み取ろうとしています。 スペースのない文字列から整数を読み取る

string str = "1Hi15This10"; 

場合、私は、私は、インデックスでみましたが、私は、文字列ではないので、私はgetlineを使用することができなかった1と10と0ではない10 を読む(1,15,10)

を取得したいです何かで区切られている。

アイデア?

+0

これはあなたを助けるかもしれません:http://stackoverflow.com/questions/17331250/read-all-integers -from-string-c –

+0

正規表現を使用してマッチングに精通していますか? '/(\ d +)/ g'のようなものを使って、文字列内の整数のグループをマッチングさせ、グループとして返​​された文字列のint自体を解析することができます。 – orphen

答えて

1

は、正規表現せずに、あなたはこの

std::string str = "1Hi15This10"; 
for (char *c = &str[0]; *c; ++c) 
    if (!std::isdigit(*c) && *c != '-' && *c != '+') *c = ' '; 

整数が今の最善の方法は、正規表現を使用することです私見

+0

'!std :: isdigit(* c)'も使うことができます。これは非文字にも対応します。また、記号文字( '+'または '-')の存在を許すために、このアプローチを適応させる必要があるかもしれません。 – Peter

+0

これは潜在的に未定義の動作を呼び出します。 [詳細](https://stackoverflow.com/questions/21805674/do-i-need-to-cast-to-unsigned-char-before-calling-toupper) –

0

を解析するために簡単ですスペース区切り文字で区切られ行うことができます。

#include <iostream> 
#include <iterator> 
#include <string> 
#include <regex> 

int main() { 
    std::string s = "1Hi15This10"; 

    std::regex number("(\\d+)"); // -- match any group of one or more digits 

    auto begin = std::sregex_iterator(s.begin(), s.end(), number); 

    // iterate over all valid matches 
    for (auto i = begin; i != std::sregex_iterator(); ++i) { 
     std::cout << " " << i->str() << '\n'; 
     // and additional processing, e.g. parse to int using std::stoi() etc. 
    } 
} 

出力:

1 
    15 
    10 

Live example here on ideone.

はい、あなたはこのために、独自のループを書くことができますが、:

  1. は、おそらくどこかの愚かなミスを犯すだろう、
  2. 正規表現はada多くの異なる検索パターンを提供するためにpted;例えば10進数/負数/浮動小数点数をサポートしたいと思った場合はどうしたらいいですか?これらのケースと他の多くのものは正規表現で簡単にサポートされますが、カスタムソリューションではあまりサポートされません:)
関連する問題