3

だから私は現在、ユーザーのテキスト入力を受け取るプログラムの一部を書いています。アルファベット以外のすべての入力文字を無視したいので、std :: isalpha()がこれを行うための良い方法であると考えました。残念ながら、私が知る限り、2つのstd :: isalpha()関数があり、一般的な関数はロケール固有の関数から明確にする必要があります。

(int(*)(int))std::isalpha()

明確にしないと、std :: isalphaは大文字を読み取るとtrueを返すように見えますが、小文字を読み取るとfalseを返すようです(ただし、戻り値を直接出力すると、非英字の場合は0、大文字の場合は1、小文字の場合は2)。だから私はこれをする必要があります。

以前に別のプログラムでこれを行ったことがありますが、何らかの理由で、このプロジェクトで「ISOC++禁止」エラーが発生することがあります。注意してください、たまにだけ。これがコードの問題のある領域です(これは間に何も入れずに一緒に表示されます):

std::cout << "Is alpha? " << (int(*)(int))std::isalpha((char)Event.text.unicode) << "\n";

if ( (int(*)(int))std::isalpha((char)Event.text.unicode) == true)
{
    std::cout << "Is alpha!\n";
    //...snip...
}

戻り値をstd::coutに送信する最初のインスタンスは、正常に機能します-これに対してエラーは発生せず、期待値(非アルファの場合は0、アルファの場合は1)を取得し、それが唯一の場所である場合曖昧さを解消してみてください。プログラムはコンパイルされ、正常に実行されます。

ただし、2番目のインスタンスはこれをスローします。

error: ISO C++ forbids comparison between pointer and integer

(int(*)(int))スニペットを削除した場合にのみコンパイルされ、その時点で不正な動作が発生します。誰かがここで私を教えてもらえますか?

4

2 に答える 2

3

呼び出しの戻り値をにキャストし、そのポインタをに比較します。ポインタをブール値と比較してもあまり意味がなく、エラーが発生します。std::alpha()int(*)(int)true

ここで、キャストなしで、intによって返されたをと比較std::alpha()trueます。boolは整数型であり、2つの異なる整数型を比較す​​るために、値は最初に同じ型に変換されます。この場合、両方ともに変換されintます。trueになり1std::isalpha()返された場合2、比較はで終わります2 != 1

std::alpha()の結果をと比較したい場合はbool、に返されたものをキャストするboolか、単に比較を省略して次のようなものを使用する必要があります。if (std::isalpha(c)) {...}

于 2012-10-08T16:35:10.433 に答える
2

通常の呼び出しにはあいまいさがないため、あいまいさを解消する必要はありません。

std::また、から関数宣言を取得するときにプレフィックスを使用する必要はありません<ctype.h>。これは、C ++ 11の後にヘッダーを使用することをお勧めします(つまり、ではありません<cctype>)。さらに言えば、C ++ 11の前でも、C ++11はそれをクリンチしました。

第三に、結果をと比較するべきではありませんtrue

ただし、 7ビットASCII以外で未定義動作が発生しないように、にchar引数をキャストする必要があります。unsigned char

たとえば、次のようにします。

bool isAlpha( char const c )
{
    typedef unsigned char UChar;
    return !!isalpha( UChar( c ) );
}
于 2012-10-08T16:39:54.300 に答える