C++中关于文字编码的问题(格式化字符串)

char与wchar_t

char中存放的是多字节型的字符,wchar_t中存放的是双字节型的字符,TCHAR在定义了_UNICODE时等同于wchar_t,在未定义_UNICODE时等同于char。

 

sprintf、wsprintf、_stprintf

sprintf是c++运行时库中的一个函数。c++ 运行时库处理字符串的函数通常都有2个版本,一个处理多字节型的字符,一个处理双字节型的字符。对于sprintf来说,它本身用于处理单字节字符,其双字节字符版本名为wprintf。
为了使用方便,c++运行时库还为每个处理字符串的库函数定义了一个宏,sprintf对应的宏的名字为_stprintf,这个宏在定义了_UNICODE时等同于wsprintf,在未定义_UNICODE时等同于sprintf。因此对于TCHAR要用_stprintf。

 


问题本身

错误代码:

TCHAR tmpText[50]; 
sprintf(tmpText,"%d,%d", a, b); 
TextOut(hDC, x, y, tmpText,lstrlen(tmpText));

sprintf处理单字节字符,它就只能接收char类型的字符串。所以,如果当前定义了_UNICODE宏,那么tmpText中的字符的类型就是wchar_t. 它就不能传给sprintf.

要使第二行代码没有问题,要么把tchar换成char,要么把sprintf换成tsprintf。由于TextOut接收tchar类型的字符串,所以不能将tchar换成char,那只能把sprintf换成tsprintf。 sprintf换成tsprintf后,其第二个参数也需要加上_T()宏,以便将其转换为tchar类型。

 

所以修改结果如下:

TCHAR tmpText[50]; 
_stprintf(tmpText,_T("%d,%d"), a, b); 
TextOut(hDC, x, y, tmpText,lstrlen(tmpText));

 

其实如果项目中没有定义_UNICODE宏,那么错误代码是可以通过编译的。但是这样的写法是有问题的,应该将代码改为:

char tmpText[50]; 
sprintf(tmpText,"%d,%d", a, b); 
TextOut(hDC, x, y, tmpText,lstrlen(tmpText));

你可能感兴趣的:(C++中关于文字编码的问题(格式化字符串))