2

文字列全体を反復処理して整数を出力することにより、文字列に整数が含まれているかどうかをテストしようとしています。私の方法では、文字列を c-string 、c-string に変換し、関数atoiを使用して整数かどうかをテストしisdigitます。なんらかの理由で、isdigit関数は整数を検出しても false を返します。

この問題を解決するには助けが必要です

#include <iostream>
using namespace std;
#include <string>

int main()
{
    string p = "[ab, e2cd]";

    for (int k = 0; k < p.length(); k++)
    {
        if (isdigit(atoi(p.substr(k,1).c_str())) == true) //testing done here
        {
            cout << atoi(p.substr(k, 1).c_str());
        }
    }
}
4

3 に答える 3

3

isdigitは、intロケールの 1 文字の値を持つ を受け取ります。unsigned charからのキャストを渡してchar、変換に任せてintも問題ありません。stringcontainsであるためchars、次のような要素を使用できます。

if ( static_cast<unsigned char>(isdigit(p[k])) ) { ....
于 2013-11-11T06:46:39.843 に答える
2

isdigit歴史的な理由から、の動作はかなり奇妙です。

これは文字値を取り、それが 10 進数 ( '0''1'、 ...のいずれか'9') であるかどうかを示します。これは、めったに結果に適用することatoi()が意味をなさないことを意味します。

ただし、文字値はcharではなく、int値が の範囲にあるとして表されunsigned charます。その他の引数値 (EOF通常は である以外-1) は、未定義の動作を引き起こします。したがって、値をテストしたい場合は、それを;charにキャストする必要があります。unsigned charプレーンcharが署名されている場合、キャストを省略すると、未定義の動作が発生する危険があります。

そして、結果はbool. これintは、数字以外の場合は値が 0 であり、数字の場合はゼロ以外の任意の値です。と等しいかどうかの結果を比較しないでくださいtrue。さらに言えば、等値または不等値の条件を表す値を or と比較ないでください。すでに条件になっているので、直接使用してください。falsetrue

の場合cchar、置き換えます

if (isdigit(c) == true)

if (isdigit((unsigned char)c))

また

if (isdigit(static_cast<unsigned char>(c)))
于 2013-11-11T07:06:27.320 に答える
2

atoicstring を数値に変換します。文字列が無効な場合は、0 が返されるためわかりませんatoi。これは、文字列内の数値でもある可能性があります。

isdigit文字は int として渡され、false数字でない場合は返されます。つまり、リンゴとオレンジを比較しています。

文字列を反復処理して各文字をに渡すだけisdigit()で、これが機能する場合は、を使用atoiして変換できます。

+ただし、文字列に数値が含まれているか-、数値の一部として含まれており、この場合isdigit()は返されないという落とし穴があります。true他の文字も有効な数値の一部である可能性がありますが、単純な整数値の場合はこれで十分です。

于 2013-11-11T06:46:08.857 に答える