1

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

该程序适用于 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;   
}
4

3 回答 3

1

你可以使用tchar* input然后

 wstring chStr = L"abc";  
 std::wstring s(input)
 chStr += s;
于 2011-07-10T05:58:05.050 回答
0

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

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

不再使用 TCHAR 真的没有意义。TCHAR 类型是 WCHAR 还是 char 取决于是否定义了宏 UNICODE。TCHAR 在您想要编写可以编译两次的代码时很有用——一次用于 ASCII,一次用于 UNICODE。例如,当您想编写可以编译为在 ASCII 平台(如 Windows 95)上高效运行并再次编译以在 UNICODE 平台(如 Windows XP)上高效运行的代码时。

现在所有当前的 Windows 操作系统都是原生的 UNICODE,TCHAR 没有太多用处,使用它也有一些风险。

例如,您的代码TCHAR ch = L'a';在为 UNICODE 编译时是有效的,因为在这种情况下 TCHAR 被定义为 WCHAR。但是,当为非 UNICODE 编译时,TCHAR 被定义为 char 并且将 Unicode 字符分配给L'a'char 变量并没有真正的意义。您不一定会得到语法错误,但也不一定会得到您期望的代码。

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

于 2011-07-10T07:03:28.657 回答
0

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

说你需要使用 %ls 而不是 %s 和 wprintf()

:)

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

于 2011-07-10T07:02:04.513 回答