我有一些非常简单的事情,我试图提示用户进行字符输入&将该字符保存到字符串中。然后我打印整个字符串。
该程序适用于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;
}
答案 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
函数需要%s
format 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。