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

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

wprintf() では %s ではなく %ls を使用する必要があると言います

:)

ご覧のとおり、ワイド文字列を 1 つの char と null を持つ char 文字列として読み取っています。

于 2011-07-10T07:02:04.513 に答える
0

あなたのテストは、あなたが示していると思っているものを示していません。

この関数は、フォーマット仕様printfに ASCII 文字列パラメータを想定しています。文字の UNICODE 表現は 0x0061 で、これはメモリに 0x61、0x00 として格納されます (リトルエンディアンシステムを扱っているため)。printf はメモリを ASCII 文字列として解釈しているため、0x61、0x00 は 1 文字の長さの null で終了する文字列のように見えるため、それが出力されます。%sa

もう TCHAR を使用する意味はありません。TCHAR タイプは、マクロ UNICODE が定義されているかどうかに応じて、WCHAR または char のいずれかになります。TCHAR は、ASCII 用に 1 回、UNICODE 用に 1 回、2 回コンパイルできるコードを記述したい場合に便利です。たとえば、ASCII プラットフォーム (Windows 95 など) で効率的に実行できるようにコンパイルし、UNICODE プラットフォーム (Windows XP など) で効率的に実行できるように再度コンパイルできるコードを書きたい場合などです。

現在のすべての Windows オペレーティング システムはネイティブで UNICODE であるため、TCHAR はあまり使用されておらず、使用するリスクもあります。

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

上記で「ASCII」を使用した場合、すべての非 UNICODE 文字セットが ASCII であるとは限らないため、おそらく「マルチバイト文字セット」または「非 UNICODE 文字セット」と言うべきでした。

于 2011-07-10T07:03:28.657 に答える