2017-01-24 7 views
0

文字列から整数を抽出しようとしています。ここで何が間違っているのでしょうか? 私は最初の価値しか得ていません。どのように私は文字列内のゼロでも動作させることができますか?この条件が常に真であることをC++複数の区切り文字を含む文字列内の整数を抽出する

if(c != ',' || c != '-' || c != ';') 

注意を、あなたは常に句読点文字をINGのungetです:

string str="91,43,3,23,0;6,9,0-4,29,24"; 
std::stringstream ss(str); 
int x; 
while(ss >> x) 
{ 
    cout<<"GOT->"<<x<<endl; 
    char c; 
    ss >> c; //Discard a non space char. 
    if(c != ',' || c != '-' || c != ';') 
    { 
     ss.unget(); 
    } 
} 
+0

むしろ無関係なノートでは、おそらく正規表現は、HTTPに探して価値がある:// WWW .cplusplus.com/reference/regex/regex_search/ – TuanDT

答えて

3

はこのラインで非常に密接に見て。次の読み込みは、数字が予想されるときに句読点を読み込むときに常に失敗します。 ||&&に変更すると問題が解決するはずです。

もちろん、あなたのコードでは、strは非常に特殊な方法でフォーマットされているとみなされ、別の形式のstr値が与えられたときに破損する可能性があります。それだけに気をつけてください。

0

uは、これをブーストスプリットで行うことができます。

int main() { 
     std::stringstream ss; 
     std::string inputString = "91,43,3,23,0;6,9,0-4,29,24"; 
     std::string delimiters("|,:-;"); 
     std::vector<std::string> parts; 
     boost::split(parts, inputString, boost::is_any_of(delimiters)); 
     for(int i = 0; i<parts.size();i++) { 
      std::cout <<parts[i] << " "; 
     } 
    return 0; 
    } 

出力(ちょうど整数): - 91 43 3 23 0 6~9 0 4 29 24

+2

「boost」を使用せずにソリューションを提供する –

0

これはチャーに文字列を変更して償却されます; -

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
    string str = "91,43,3,23,0;6,9,0-4,29,24"; 
    str.c_str(); // ex: string a; --> char a[]; 
    char a[99]; 
    int j = 0; 
    int x; 
    for(int i = 0; i < str.length(); i++){ 
     if (str[i]!=',' && str[i]!=';' && str[i]!='-'){ 
      a[j] = str[i]; 
      j++; 
     } 
    } 
    return 0; 
} 

希望すると、これが役に立ちます。

0

これは、私が整数を抽出し、必要に応じて区切り文字を追加できるという私の目的に合っています。異なるフォーマットの文字列でも動作します。 (私はそれゆえ、この方法を好む、ブーストlibが持っていけない。)

int main() 
{ 
    string str="2,3,4;0,1,3-4,289,24,21,45;2"; 
    //string str=";2;0,1,3-4,289,24;21,45;2"; //input2 

    std::stringstream ss(str); 
    int x=0; 

    if(str.length() != 0) 
    { 
     while(!ss.eof()) 
     { 
     if(ss.peek()!= ',' && ss.peek()!=';' && ss.peek()!='-') /*Delimiters*/ 
     { 
      ss>>x; 
      cout<<"val="<<x<<endl; 
      /* TODO:store integers do processing */ 
     } 
     ss.get(); 
     } 
    } 
} 
0

ます。また、試すことができます。

vector<int> SplitNumbersFromString(const string& input, const vector<char>& delimiters) 
{ 
    string buff{""}; 
    vector<int> output; 

    for (auto n : input) 
    { 
     if (none_of(delimiters.begin(), delimiters.end(), [n](const char& c){ return c == n; })) 
     { 
      buff += n; 
     } 
     else 
     { 
      if (buff != "") 
      { 
       output.push_back(stoi(buff)); 
       buff = ""; 
      } 
     } 
    } 
    if (buff != "") output.push_back(stoi(buff)); 

    return output; 
} 

vector<char> delimiters = { ',', '-', ';' }; 
vector<int> numbers = SplitNumbersFromString("91,43,3,23,0;6,9,0-4,29,24", delimiters); 
関連する問題