2016-04-18 12 views
5

私はこのような文字列を持っている言葉&数字の文字列を解析します 「123plus43times7」の数字が辞書からの単語が続いている文字列ストリーム++

を。

StringStream >> number 

私は数を取得することができます:

は私が>>演算子を使ってint型/数字を抽出できることを理解しています。しかし、ストリームにはまだ数字が入っています。数値の長さが不明な場合、または数値の長さを見つけてstr.substr()を使用して新しい文字列ストリームを作成する必要がある場合は、数値を削除するにはどうすればよいですか? C++ STL StringとSStreamを使用して他の方法を実行する方法があれば、本当に感謝します。

+1

を行うための一つの方法ですstd :: stringを繰り返し、文字を繰り返して連続する数字ブロックと文字ブロックに分割します。ブロックを分割すると、 'std :: atoi()'を介して数字のシーケンスを整数に変換することができます。 –

+0

@DanMašekは正しいです。数字を取得すると、 'string'をつかみ、' string'への '' 'は空白で止まるだけです。あなたの手紙、あなたの番号、それ以外のものはすべて手に入れます。 – user4581301

答えて

3

あなたは、テキストと数字の間の空白を挿入し、std::stringstream

#include <iostream> 
#include <string> 
#include <sstream> 
#include <cctype> 

int main() 
{ 
    std::string s = "123plus43times7"; 
    for (size_t i = 0; i < (s.size() -1); i++) 
    { 
     if (std::isalpha(s[i]) != std::isalpha(s[i + 1])) 
     { 
      i++; 
      s.insert(i, " "); 
     } 
    } 
    std::stringstream ss(s); 
    while (ss >> s) 
     std::cout << s << "\n"; 
    return 0; 
} 
+0

'while(ss >> s)とは何ですか?元の文字列 's'を上書きするようです。それは 'ss'が(元の)' s'のコピーを保持していることを意味しますか? –

+0

これは毎回 's'を上書きします。 'ss'はファイルストリームに似ていますが、その内容は変更されませんが、各操作後に次のファイル位置に移動します。結果はこちら:https://ideone.com/qvJvMV –

2

を使用することができますが、ここでちょうどに文字列全体を読み取ることがずっと簡単と思われるそれを

string as = "123plus43times7"; 

    for (int i = 0; i < as.length(); ++i) 
    { 
     if (isalpha(as[i])) 
      as[i] = ' '; 
    } 

    stringstream ss(as); 
    int anum; 

    while (ss >> anum) 
    { 
     cout << "\n" << anum; 
    } 
関連する問題