2011-07-10 31 views
1

我有一些非常簡單的事情,我試圖提示用戶輸入字符&,將該字符保存到字符串中。然後我打印整個字符串。向wstring添加TCHAR:不起作用

該程序是爲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; 
} 
+0

爲什麼你需要ASCII支持?你還在使用Windows 3嗎? –

+0

沒有'std :: tstring'。你可以這樣做:'typedef std :: basic_string tstring' – Nubcase

+0

'TCHAR'是一個typedef,可以是'char'或'wchar_t',所以你必須以某種方式解釋它。這是一個[小咆哮](http://stackoverflow.com/questions/6300804/wchars-encodings-standards-and-portability)我廣泛的字符通用。 –

回答

1

您可以使用tchar* input然後

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

那是正確的,getch()是int,並且我們需要一個wstring – Ulterior

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。 TCHAR在您希望編寫可以編譯兩次的代碼的情況下非常有用 - 一次用於ASCII,一次用於UNICODE。例如,當您想要編寫可以在ASCII平臺(如Windows 95)上編譯以有效運行的代碼並再次編譯以在UNICODE平臺(如Windows XP)上高效運行時。

既然目前所有的Windows操作系統本身都是UNICODE,那TCHAR並沒有多大用處,使用它的風險也不大。

例如,編碼爲UNICODE時,您的代碼TCHAR ch = L'a';有效,因爲在這種情況下TCHAR被定義爲WCHAR。但是,當編譯爲非UNICODE時,TCHAR被定義爲char並將一個Unicode字符(如L'a')分配給char變量並沒有什麼意義。你不一定會得到語法錯誤,但你不一定會得到你期望的代碼。

注意我在哪裏使用「ASCII」上面我也許應該真的有說「多字節字符集」或「非Unicode字符集」,因爲不是所有的非Unicode字符集是ASCII。