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); 试图将变量类型确认为字符并收到相同的输出。

这是一个班级的作业,所以我不希望有太多帮助,我只想知道为什么我的函数返回整数而不是字符,以便我知道我的错误是什么以供将来参考,谷歌并没有太大帮助。是toupper的某种范围问题吗?

4

4 回答 4

5

toupper 的意图是它可以在英语以外的其他语言中工作,因此它必须支持大于 8 位的输入和输出char,因此应该返回可以转换为 unicode 或 UTF 字符的内容。

只是简单地将其转换char为可能是错误代码的来源,这取决于您的软件的目的是什么。

看看这个关于如何将它用于宽字符和 unicode 的问题。

将 C++ 中的 unicode 字符串转换为大写

于 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 回答