2009-08-07 33 views
1

以下は私の機能です。私はなぜこの変換が機能しないのですか?

if(try_strtol(v, rhs)) 

とRHSそれは= 15 Vで真除いI、falseを返す= "15 \トン//コメント"

bool try_strtol(int64_t &v, const string& s) 
{ 
    try 
    { 
     std::stringstream ss(s); 
     if ((ss >> v).fail() || !(ss >> std::ws).eof()) 
      throw std::bad_cast(); 
     return true; 
    } 
    catch(...) 
    { 
     return false; 
    } 
} 

でそれを呼び出します。どのように私はこれを修正するのですか?

+0

なぜそれが真実になると思いますか?あなたは '(ss >> std :: ws).eof()'を評価するために何を期待していますか?または '(s >> v).fail()'のようなものですか? –

+3

ステップ1:巧みにしようとしないでください。表現を分けて読めるようにしてください。あなたは誰も誰もしていません。特にあなた自身。ユニットテストのセットで作業したら、それがまだ動作するかどうかを確認するために少しの最適化を試してみてください。 –

+1

実際、私はマーティンに書いた。 http://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/1243435#1243435 – GManNickG

答えて

2

あなたはそれがboolean型を返すようにしたい場合は、ちょうどこの操作を行います。それは悪いキャストだから

bool try_strtol(int64_t &v, const string& s) 
{ 
    std::stringstream ss(s); 
    return (ss >> v).fail() || !(ss >> std::ws).eof(); 
} 

そして、それは失敗だが。コメントが無視されることを期待していましたか?

+0

はい:D。私のストリームナレッジは貧弱で、2時間以内に宿題の途中です(私はそれをするのに4時間、私は不在でした)。むしろintを適切に変換して、自分自身で貧弱なバージョンを書く方法を尋ねます。 –

+0

おっと、私は昨日の投稿を説明しませんでした。私は寝る前にそれを始めました。私は1時間前に目が覚めた。 –

+0

ああ、もう一度これらの答えに感謝します。D –

4

なぜ(ss >> std::ws).eof()が本当であると思われますか? rhsには15の後に空白以外の文字が含まれているため、if条件がtrueになり例外がスローされるため、falseが返されます。

3

std :: wsがタブをスキップした後、あなたはまだeofにいません。

+0

私は完全にそれを逃した。私はストリームを十分に理解していないし、急いでいた –

0

ストリームIOがC++のコメントを空白として扱うことが期待される場合はそうではありません。

関連する問題