4

次の関数の

void display()
{
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            if (board[i][j] < 84 && (i+j)%2 == 0)
                SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x70);
            else if (board[i][j] < 84 && (i+j)%2 == 1)
                SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0xc0);
            else if (board[i][j] > 97 && (i+j)%2 == 0)
                SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x7c);
            else if (board[i][j] > 97 && (i+j)%2 == 1)
                SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0xc7);
            cout << " " << toupper(board[i][j]) << " ";
        }
        cout << endl;
    }
}

char board[8][8] の文字を返す代わりに、整数を返すので、出力は次のようになります

 82  78  66  81  75  66  78  82

 80  80  80  80  80  80  80  80 

 32  32  32  32  32  32  32  32 

 32  32  32  32  32  32  32  32 

 32  32  32  32  32  32  32  32 

 32  32  32  32  32  32  32  32 

 80  80  80  80  80  80  80  80 

 82  78  66  81  75  66  78  82 

期待される出力ではなく

 R  N  B  Q  K  B  N  R

 P  P  P  P  P  P  P  P




 P  P  P  P  P  P  P  P

 R  N  B  Q  K  B  N  R

また、char a = board[i][j]; を宣言しようとしました。cout << toupper(a); 変数の型が文字であることを確認しようとして、同じ出力を受け取りました。

これはクラスの割り当てなので、あまり助けを期待していません。関数がcharの代わりに整数を返す理由を知りたいので、将来の参考のために自分の間違いが何であるかを知りたいのですが、Googleはあまり役に立ちませんでした。それはタッパーのある種の範囲の問題ですか?

4

4 に答える 4

5

toupper の意図は、英語以外の言語で動作できるようにすることです。そのため、8 ビットより大きい入出力をサポートする必要がありchar、そのため、Unicode または UTF 文字に変換できるものを返す必要があります。

単にキャストするだけでcharは、ソフトウェアの目的によっては、後でバグのあるコードのソースになる可能性があります。

ワイド文字とユニコードに使用する方法については、この質問をご覧ください。

C++ のユニコード文字列を大文字に変換する

于 2014-09-21T20:13:15.770 に答える
2

cout << char(toupper(board[i][j]));toupper の間抜けな戻り値の型を回避するには、を使用する必要があります。

于 2014-09-21T20:01:27.387 に答える
0

Toupper 関数は、そのような値が存在する場合は c に相当する大文字を返し、そうでない場合は c (変更なし) を返します。値は、暗黙的に char にキャストできる int 値として返されます。

http://www.cplusplus.com/reference/cctype/toupper/

于 2014-09-21T19:57:27.080 に答える
0

ドキュメントは明確です: http://www.cplusplus.com/reference/cctype/toupper/

int toupper ( int c );

したがって、次のようにキャストするだけですchar:

cout << " " << (char) toupper(board[i][j]) << " ";
于 2014-09-21T19:59:40.360 に答える