将TCHAR添加到wstring:不起作用

时间:2011-07-10 05:50:02

标签: c++ unicode wstring

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

该程序适用于Windows,但我希望该程序适用于ASCII和&amp ;; 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;   
}

3 个答案:

答案 0 :(得分:1)

您可以使用tchar* input然后

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

答案 1 :(得分:0)

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

说你需要使用 使用wprintf()

,%ls不是%s

:)

你看,它正在将宽字符串作为char字符串读取,其中包含一个char和一个null。

答案 2 :(得分:0)

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

printf函数需要%sformat specification的ASCII字符串参数。字母a的UNICODE表示形式为0x0061,存储在内存中为0x61,0x00(因为我们正在处理little-endian系统)。由于printf将内存解释为ASCII字符串,因此0x61,0x00看起来是一个空字符串,长度为一个字符,因此这就是您打印的内容。

再使用TCHAR并没有多大意义。 TCHAR类型是WCHAR还是char,具体取决于the macro UNICODE is defined or not。如果要编写可以编译两次的代码,一次用于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。