toupper 返回整数而不是字符

jer*_*uth 4 c++ toupper

对于以下函数

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它不是返回 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 
Run Code Online (Sandbox Code Playgroud)

而不是预期的输出

 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
Run Code Online (Sandbox Code Playgroud)

我还尝试声明 char a = board[i][j]; cout << toupper(a); 尝试确认变量类型为字符并收到相同的输出。

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

Sor*_*ren 5

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

简单地将其转换为char可能是稍后出现错误代码的来源,具体取决于您软件的用途。

看看这个问题,了解如何将它用于宽字符和 unicode。

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

  • C,第 7.4 节“标头 `&lt;ctype.h&gt;` 声明了几个可用于分类和映射字符的函数。在所有情况下 ** 参数都是 `int`,其值应可表示为 `unsigned char`或者应等于宏`EOF`**的值。如果参数有任何其他值,则行为未定义。该参数不是“char”与 Unicode 无关。它可能也与语言环境无关。请参阅http://stackoverflow.com/q/17452847和http://stackoverflow.com/q/5919735 (3认同)