2011-07-10 7 views
1

私は何か非常に簡単ですが、私は文字入力のためにユーザーに入力を促しています&文字を文字列に保存します。それから私はその全体の文字列を印刷します。wstringにTCHARを追加する:動作しません

プログラムはウィンドウ用ですが、私はASCIIの&ユニコードのためにプログラムを動作させたいので、私はユーザー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'は 'char'か' wchar_t'のどちらかのtypedefですので、何とかそれを考慮する必要があります。ここでは、ワイドチャールの一般性に関する私の[少し暴言](http://stackoverflow.com/questions/6300804/wchars-encodings-standards-and-portability)です。 –

答えて

1

あなたはtchar* inputを使用することができ、その後、

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

thats right、getch()はintで、wstringが必要です – Ulterior

0

あなたのテストでは、それが表示されていると思われるものが表示されていません。

printf関数には、%sformat specificationのASCII文字列パラメータが必要です。 aという文字のUNICODE表現は、0x00,0x00としてメモリに格納されている0x0061です(little-endianシステムを扱っているため)。 printfはメモリをASCII文字列として解釈しているので、0x61、0x00は1文字長のヌル終了文字列のように見えるので、印刷されます。

TCHARを使用するのは実際には意味がありません。 TCHARタイプは、the macro UNICODE is defined or notに応じてWCHARまたはcharのいずれかです。 TCHARは、ASCII用に1回、UNICODE用に1回、コンパイルできるコードを2回書く場合に便利です。たとえば、ASCIIプラットフォーム(Windows 95など)で効率的に実行できるようにコンパイルされ、UNICODEプラットフォーム(Windows XPなど)で効率的に実行されるようにコンパイルされたコードを書くときなどです。

現在、すべてのWindowsオペレーティングシステムはネイティブでUNICODEなので、TCHARの使用はそれほど多くなく、使用するリスクもありません。

たとえば、コードTCHAR ch = L'a';は、UNICODE用にコンパイルするときに有効です。その場合、TCHARがWCHARであると定義されているためです。しかし、非ユニコードのためにコンパイルするとき、TCHARはcharであると定義され、L'a'のようなUnicode文字をchar変数に割り当てることは本当に意味をなさない。構文エラーは必ずしも発生しませんが、必ずしも期待したコードが得られるわけではありません。

Note上記の「ASCII」を使用した場所では、すべての非ユニコード文字セットがASCIIでないため、「マルチバイト文字セット」または「非ユニコード文字セット」と言っているはずです。

関連する問題