8

どうやらこれは、文字列が数値であるかどうかを示すのに役立つと思われます。たとえば、 "12.5" == yes、 "abc"==noです。しかし、私は入力を無防備にすることはできません。

std::stringstream ss("2");
double d; ss >> d;
if(ss.good()) {std::cout<<"number"<<std::endl;}
else {std::cout<<"other"<<std::endl;}
4

4 に答える 4

7

good()は使用しないでください。ストリームが失敗したかどうかをテストします。

if (ss)

Goodは、eofbit、badbit、またはfailbitのいずれかが設定されているかどうかを示し、fail()はbadbitとfailbitについて示します。ストリームが失敗したことをすでに知っていない限り、eofbitを気にすることはほとんどないので、良いものを使いたくはほとんどありません。

上記のように、ストリームを直接テストすることは、次のこととまったく同じであることに注意してください。

if (!ss.fail())

逆に、!ssはss.fail()と同等です。


抽出を条件式に組み合わせる:

if (ss >> d) {/*...*/}

とまったく同じです:

ss >> d;
if (ss) {/*...*/}

ただし、文字列全体をdoubleに変換できるかどうかをテストすることをお勧めします。これは、もう少し複雑です。すでにすべてのケースを処理しているboost::lexical_castを使用します。

于 2011-02-07T00:50:08.067 に答える
6

aに数字のみstringが含まれていて、他に何も含まれていないかどうか(空白を除く)を確認する場合は、次を使用します。

#include <sstream>

bool is_numeric (const std::string& str) {
    std::istringstream ss(str);
    double dbl;
    ss >> dbl;      // try to read the number
    ss >> std::ws;  // eat whitespace after number

    if (!ss.fail() && ss.eof()) {
        return true;  // is-a-number
    } else {
        return false; // not-a-number
    }
}

は、。ss >> std::wsなどの末尾に空白がある数値を受け入れるために重要です"24 "

ss.eof()チェックは、のような文字列を拒否するために重要です"24 abc"。数字(および空白)を読み取った後、文字列の最後に到達したことを確認します。

テストハーネス:

#include <iostream>
#include <iomanip>

int main()
{
    std::string tests[8] = {
            "", "XYZ", "a26", "3.3a", "42 a", "764", " 132.0", "930 "
    };
    std::string is_a[2] = { "not a number", "is a number" };
    for (size_t i = 0; i < sizeof(tests)/sizeof(std::string); ++i) {
        std::cout << std::setw(8) << "'" + tests[i] + "'" << ": ";
        std::cout << is_a [is_numeric (tests[i])] << std::endl;
    }
}

出力:

      '': not a number
   'XYZ': not a number
   'a26': not a number
  '3.3a': not a number
  '42 a': not a number
   '764': is a number
' 132.0': is a number
  '930 ': is a number
于 2013-02-15T17:30:26.743 に答える
4

istringstream入力を解析しようとしていることがわかるように、を使用する必要があります。goodまた、後で使用するのではなく、抽出の結果を直接確認するだけです。

#include <sstream>
#include <iostream>

int main()
{
    std::istringstream ss("2");
    double d = 0.0;
    if(ss >> d) {std::cout<<"number"<<std::endl;}
    else {std::cout<<"other"<<std::endl;}
}
于 2011-02-07T00:49:20.360 に答える
-1
int str2int (const string &str) {
  stringstream ss(str);
  int num;
  if((ss >> num).fail())
  { 
      //ERROR: not a number
  }
  return num;
}
于 2011-02-07T00:56:04.663 に答える