将 TCHAR 添加到字符串:不起作用

Adding a TCHAR to a wstring: doesn't work

本文关键字:不起作用 字符串 TCHAR 添加      更新时间:2023-10-16

我有一些非常简单的事情要做,我试图提示用户输入字符&将该字符保存到字符串中。然后打印整个字符串

该程序适用于windows,但我希望该程序适用于ASCII &Unicode,这就是为什么我使用TCHAR, &wstring .

我的问题:我无法添加字符(用户输入)到一个wstring。它不会存储在那个变量中。为什么?

我的简单代码:
#include <windows.h>
#include <tchar.h>
#include <conio.h>  
#include <stdio.h>  
#include <string>
#include <iostream>
using namespace std;
int main()
{
    // I am using wstring for unicode compatibility but in Windows(MSDN) is there a general
    // string variable? You know how there is char, wchar & then TCHAR(which is a general variable
    // for both ASCII & unicode). Is there a TSTRING or something?
    wstring chStr = L"abc";  
    TCHAR ch      = L'a';
    while ( ch != '!' )
    {
          printf("Enter a character: ");
          ch = getch();
          chStr += ch; // the string never takes on a char it always remains as "a"
          printf("nThe characters entered so far are: %s n", chStr.c_str()); 
    }
    system("PAUSE");
    return 0;   
}

您可以使用tchar* input,然后

 wstring chStr = L"abc";  
 std::wstring s(input)
 chStr += s;

http://linux.about.com/library/cmd/blcmdl3_wprintf.htm

表示需要使用使用wprintf()

:)

你看,它将宽字符串读取为一个char和一个null的char字符串

您的测试没有显示您认为它显示的内容。

printf函数需要%s格式规范的ASCII字符串参数。字母a的UNICODE表示是0x0061,它在内存中存储为0x61, 0x00(因为我们处理的是一个小端系统)。由于printf将内存解释为ASCII字符串,因此0x61, 0x00看起来是一个以空结束的字符串,长度为一个字符,因此这就是您打印的内容。

使用TCHAR已经没有意义了。TCHAR类型是WCHAR或char,具体取决于是否定义了宏UNICODE。如果您想编写可以编译两次的代码——一次用于ASCII,一次用于UNICODE, TCHAR非常有用。例如,当您希望编写可以在ASCII平台(如Windows 95)上有效运行的编译代码,并再次编译以在UNICODE平台(如Windows XP)上有效运行的代码时。

现在所有的Windows操作系统都是原生的UNICODE, TCHAR没有太多的用途,使用它有一定的风险。

例如,你的代码TCHAR ch = L'a';在编译UNICODE时是有效的,因为在这种情况下,TCHAR被定义为WCHAR。但是,在编译非UNICODE时,TCHAR被定义为char,并且将像L'a'这样的UNICODE字符分配给char变量实际上没有意义。你不一定会得到一个语法错误,但你也不一定会得到你想要的代码。

注意我在上面使用"ASCII"的地方可能应该说"多字节字符集"或"非unicode字符集",因为并非所有非unicode字符集都是ASCII。