这是我的代码,我只想将字符串中的一个字符转换为大写。
TCHAR sPassword[16] = L"password";
INT iChar = toupper(sPassword[4]);
sPassword[4] = iChar;
它运行正常,但我收到警告:
warning C4244: '=': conversion from 'int' to '_Ty', possible loss of data
我试着用(INT)
铸造iChar
,但没有什么区别。
警告是由于INT
对象缩小为TCHAR
对象。这些类型的存在无疑提供了可修复性,并且可能与其他编译设置的范围相同。
当TCHAR
是char
或朋友时,@ZsigmondSzabó回答的TCHAR iChar = (TCHAR) toupper(sPassword[4]);
是个好主意。
然而,还有一个更深层次的问题:toupper()
用于单字节大小写转换,当TCHAR
不是char
等时,它不是最好的转换函数。
代码可能是:
int iChar = toupper(sPassword[4]); // if toupper must be used
sPassword[4] = (TCHAR) iChar;
为了处理一般的TCHAR
大小写转换,代码需要更大的灵活性。
TCHAR
既不是标准的C类型,也不是定义。
假设这是MSTCHAR
,则考虑_totupper()
。
TCHAR iChar = (TCHAR) _totupper(sPassword[4]);
sPassword[4] = iChar;
您收到警告,因为TCHAR是char
(1字节(,而iChar
是int
(很可能是4字节(。为了给一个字符分配一个整数,它必须截断int
以适应char
,这显然会丢失3字节的数据。您可以通过显式地将iChar
强制转换为TCHAR
来消除错误,如下所示:
sPassword[4] = (TCHAR) iChar;
或者,您可以将iChar
声明为TCHAR
,并在分配时进行转换,如下所示:
TCHAR iChar = (TCHAR) toupper(sPassword[4]);