2011-08-16 17 views
-2

データベースからIntegersを読まなければならないという問題があります。変数はStringsとして返され、"","0","1","2"または"3"(これらは私がこれまで見てきたものです)とすることができます。 したがって、標準atoi関数を使用すると、私は"""0"を区別することができないので役に立ちません。整数かどうかチェック

誰かがこれを解決する良い解決策を持っていますか?

よろしく、 ステファン

EDIT:

""、 "0"、 "1"、 "2" または "3" は、私がこれまで見てきた唯一の可能性はありません。誰かが "Hello World"をフィールドに書いている可能性もあります!!!

int main() 
{ 
    std::stringstream tmp; 
    tmp << ""; //This would be the string from the database 
    int x; 
    if (tmp >> x) 
    { 
     //We won't get here 
     std::cout << x << std::endl; 
    } 

VS:

+5

最初に文字列が空であることを確認します。 –

+0

@Kerrek:+1。ここには1つの特別なケースしかありませんが、それはチェックするのに莫大な負担ではありません。 –

答えて

1

パフォーマンスがあなたのケースでは問題がある場合、私は以下のことを提案する:

解決方法1:

std::string input(<your string value>); 
int val; 
if (sscanf(input.c_str(), "%d", &val) != 1) 
{ 
    cout << "it's empty/not an integer"; 
} 
else 
{ 
    cout << "val is:" << val; 
} 

が解決策2:

std::string input(<your string value>); 
int val; 
if(strcmp(input.c_str(), "") ==0) 
{ 
    cout << "it's empty"; 
} 
else 
{ 
    val = atoi(input.c_str()); 
    cout << "val is:" << val; 
} 

入力が無効なコンテンツ(整数ではない)を開始すると、atoiソリューションが失敗する(atoiが失敗した場合0を返す)ため、最初のソリューションを使用することをお勧めします。

値が "0"、 "1"、 "2"、 "3"のみである場合でも、2番目の解決策も有効です。

3

使用stringstreamは、変換を行うには

int main() 
{ 
    std::stringstream tmp; 
    tmp << "0"; 
    int x; 
    if (tmp >> x) 
    { 
     //Will output 0 
     std::cout << x << std::endl; 
    } 

EDIT:このコードケースを処理するときに誰か入力の "Hello World"

0

1つの条件はチェックするのが簡単です("")空になります。

第二に、あなたは、文字列に二重引用符または最初の1のインデックスが存在しない場合std::string::nposを返します

std::string::find('"');

ような何かをやって引用符を削除することができます。

std::string::erase(pos, npos);

関連する問題