-3

メモに次のような関数が見つかりました。

int isdigit(int c);

が数字のtrue場合に返します。c

しかし、私が見つけることができないEclipseでエラーが発生し続けるとき。

これまでの私のコード:

for(;;) {
    if (int !isdigit(int(library[count].tele))) { // if a letter,
        printf("Please enter numbers only.");
        count --;
        Menu();
    }
    else
        break;
}

library[count].teleint(構造体) です。

私がやりたいのは、電話番号に文字が含まれていないことを確認することだけです。

4

3 に答える 3

1

isdigit元の Cでは、文字として発生しない値としてintエンコードするのに十分な範囲を確保するために、文字コードを整数として処理したため、引数が必要です。EOF

C++ では、次のような非 ASCII 文字の未定義の動作を回避するためにラップすることをお勧めします。

bool isDigit( char const c )
{
    return !!::isdigit( (unsigned char)c );
}

単一の文字をチェックします

文字列をチェックするために、各文字を順番にチェックできます。

bool isDigits( string const& s )
{
    for( char c : s )
    {
        if( !isDigit( c ) ) { return false; }
    }
    return true;
}

この解決策は、ASCII ベースのエンコーディングの仮定に依存していますが、実際には、2013 年時点で遭遇する可能性のあるすべてのエンコーディングは ASCII に基づいています。


「バンバン」!!は、最も使用されている C++ コンパイラである Visual C++ でのばかげた警告を回避します。この目的のために、キャストに置き換えることはできません。愚かな警告の抑制を除いて、この明示的な変換は必要ありません。最終的な効果は、暗黙的な変換に対する言語の保証と同じです

于 2013-01-05T15:47:04.457 に答える
0

は、数字 ('0' - '9') ではない!isdigit( ch )ことをテストします。これは、文字以外のすべての非数字文字を対象とするため、 letterchのテストと同じではありません。true

この場合、それは!isdigit( ch )実際にはまさにあなたが望むものである可能性がありますが、特に文字をチェックしたい場合は、 を使用しますisalpha( ch )

文字列全体で有効な文字を一度に (つまり、ループなしで) チェックしたい場合は、次のように簡単に使用できます。

if( strspn( telehone_num, "0123456789" != strlen(telephone_num) ) 
{ 
    printf("Please enter numbers only.");
    Menu();
}

ここで、 telephone_num は C 文字列 (int ではありません) です。もちろん、C ではなくこの C++ にタグを付けたので、std::string を使用したより良い解決策が考えられます。

それを超えて、許可したいさまざまな地域の電話番号に関する特定の規則があると考えるかもしれません. たとえば、英国では市外局番と市内番号をスペースで区切るのが一般的です。

01225 123456

さらに、国際ユーザーは番号を次のように表現する場合があります。

+44 (0)1225 123456

「英国外から電話をかける場合は、市内の国際電話番号に続いて 44 をダイヤルし、次に市外局番の先頭の 0 を省略して加入者番号をダイヤルします」という意味です。これだけの情報を数字だけで伝えるのは困難です。人間ではなく機械が番号をダイヤルする場合を除き、ユーザーが好きなように入力できるようにした方がよい場合があります。

于 2013-01-05T16:13:49.020 に答える
0

はい、ご利用いただけますisdigit。ただし、入力文字列の各文字に個別に適用isdigitし、返される内容に基づいて決定する必要があります。

あなたはそれlibrary[count].teleがタイプだと言いintます。値が に格納されるintまでには、数字以外が含まれているかどうかを判断するには遅すぎます (できません)。したがって、文字列から への変換前にチェックを実行する必要がありますint

于 2013-01-05T15:43:10.197 に答える