C++ toupper返回整数而不是字符

C++ toupper返回整数而不是字符,c++,toupper,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 ),

对于以下函数

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;
    }
}
而不是预期的产量

 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];coutToupper函数返回与c等价的大写字母(如果该值存在),否则返回c(未更改)。该值作为可以隐式转换为char的int值返回


文档很清楚:

因此,您只需将其转换为
char

cout << " " << (char) toupper(board[i][j]) << " ";

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

根据软件的用途,简单地将其转换为char可能会导致以后出现错误代码

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


您是否尝试过强制转换
toupper
的返回值?为什么不先使用google up作为参考?如果您只是想要一个将ASCII大写字符转换为ASCII小写字符的函数,我建议使用(或编写)一个特定于此编码的函数。这样的函数可以是类型安全的,即处理
char
s而不是
int
s,并且不需要处理区域设置(->更快)。
EOF
但是是
int
,它可以传递给
toupper
,但不能转换为
char
(如果
sizeof(int)>sizeof(char)
)。我没有将字符a转换为board[i][j],而是将其直接转换为toupper(board[i][j]),这似乎跳过了将字符转换为int的步骤,我想,因为我在调用toupper的同时将其转换为一个字符,所以它可能会从一个字符转换为一个整数再转换为一个字符?@dyp:当然,
EOF
的值可以转换为
char
。如果
char
是无符号的,则结果定义良好。如果
char
是无符号的,则只要
EOF>=char\u MIN
(通常是这样),结果就会得到很好的定义。不过,这种转换的结果并不是特别有用。(通常
EOF==-1
)顺便说一句,感谢您向我解释toupper的返回类型,而不是仅仅给我代码来修复我的函数,我想我现在更了解toupper定义:隐式:“暗示而不是明确声明”。执行OP的期望行为所需的cast没有任何隐含的含义。将
int
作为
char
发送到
std::cout
所需的cast是显式的,以便调用适当的重载
操作员端备注:“文档”只是一个文档。这不是官方的。对不起,我没有搜索规范。我明白了,所以toupper转换成一个整数值,我的解决方法是char a=toupper(board[I][j]);所以我相信数据类型从char到int再到char,但我认为您的解决方案会更好,因为它不需要创建不必要的变量c,§7.4“标题
声明了几个对字符分类和映射有用的函数。在所有情况下,参数均为
int
,其值应表示为
无符号字符
,或应等于宏
EOF
的值。如果参数有任何其他值,则行为未定义。“参数不是
char
与Unicode无关。它可能也与区域设置无关。请参阅,您引用的是“C”标准,但问题是关于“C”++“并且,函数据说是针对STD::WChar,根据我自己没有尝试过,如果C++中的“未定义”行为是C++中定义的,这些函数是从C标准库导入到C++的函数,我没有查过C++标准。它们不是为C++明确定义的,而是仅通过引用C标准定义的。code>wchar\u t
etc也不一定与Unicode相关。由于在典型的实现中,
无符号字符
可以表示[0255]中的值,因此它不能直接用于例如UTF-8。从这些答案中我可以看出,它们都不能可靠或正常工作
wchar\u t
在大多数*nix系统中有32位,因此可用于存储Unicode码点/UTF-32码单元。在Windows系统上,它有16位,因此不足以包含代码点。此外,适当的处理,例如德语几乎是不可能的:
BUSSE
可以是
buße
BUSSE
,这取决于其含义;前者不能以每个字符为基础。“因为在典型的实现中,一个无符号字符可以表示[0255]中的值,它不能直接用于例如UTF-8。”我必须限定这一点:它可以用于存储UTF-8代码单元,但如果将其用作参数类型,则不能(可移植地)传递额外的信息(与形成代码点的其他代码单元类似)。
int toupper ( int c );
cout << " " << (char) toupper(board[i][j]) << " ";