3

argv[1]が等しい文字列に基づいて特定の割り当てを実装しようとすると少し問題が発生します。

int _tmain(int argc, _TCHAR* argv[]) //wchar_t
{   
    if (argc != 2)
        exit(1);

    if (argv[1] == L"-foo")
        printf("Success!\n");

    wprintf(argv[1]);
    printf("\n");

    system("pause");
    return 0;
}

引数「-foo」を指定して実行可能ファイルを実行すると、次の出力が返されます。

-foo

そのはず:

Success!
-foo

文字列はまさに私が望むものですが、if-conditionはfalseのままです。文字列は、演算子wchar_tを使用して単純に比較できませんか?==もしそうなら、どうすればそれらを適切に比較できますか?

4

2 に答える 2

4

予備的注意:この回答のUnicodeおよびUnicode文字は、質問自体のコンテキストを考慮して、UCS-2(XPまで)およびUTF-16(XP以降)エンコーディングを指し、ワイド文字、、およびその他と交換可能に使用さます。 Win32APIのコンテキストでの用語。Unicode標準は、UTF-8、UTF-16、UTF-32などの複数のエンコードを提供して、同じ数の文字をエンコードします。標準の異なる化身は、異なるスコープを持ちます。代理コードポイントは、基本的な多言語平面(BMP)から脱出するために使用されます。これはおおよそ最初の64Kコードポイントであり、16ビット文字とコードポイントごとに1文字でエンコードできる以上のコードをエンコードします。wchar_tWCHAR代理拡張機能は、NT4.0がリリースされた年に渡されたUnicode2.0標準用に開発されましたが、Windowsの最初の「Unicode対応」バージョンであるNT3.51がリリースされてから数年後です。その元の標準はBMPより多くの文字を考慮していなかったため、これは不正確ですが、 Unicode文字またはワイド文字がWin32APIコンテキストでUnicodeと同義語として使用されるようになりました。

あなたが提起した根本的な質問に答えるには:

wchar_t「==」演算子を使用して文字列を単純に比較することはできませんか?

いいえ、そうではありません。また、「ANSI」文字列でもありません。つまり、char型を基準として使用します。C文字列(ベースwchar_tcharベースの両方)はポインタであることを忘れないでください。これは、==明らかに等しくない2つのポインター値を比較していたことを意味します。結局のところ、1つはリテラル文字列(つまり、プログラムイメージ内)であり、もう1つはヒープのどこかに割り当てられます。したがって、それらは間違いなく2つの異なるエンティティです。

を使用したい場合は==、C ++などの言語をSTLクラスstd::string(またはstd::basic_string<_TCHAR>)または(Windowsの場合)ATLクラスCString(または)で使用する必要がありますCStringT。これらのクラスは、スマート文字列クラスと呼ばれることもあり、をオーバーライドするC++機能を使用しますoperator==()。ただし、セマンティクスは実装によって異なるため、すべてのスマート文字列クラスが文字列の内容を比較するわけではないことに注意してください。単に同等性を比較するものもあればthis(つまり、同じインスタンスである場合)、文字列の内容を大文字と小文字を区別しないか、大文字と小文字を区別して比較する場合もあります。

C文字列を比較するには、ユースケースで使用できる次の関数があります。

  • 「ANSI」文字(char)文字列の場合:strcmp_stricmp(および「カウントされた」バリアント:_strncmp_strnicmp...その他あります)
  • Unicode文字(wchar_t)文字列の場合:wcscmp_wcsicmp(および「カウントされた」バリアント:_wcsncmp_wcsnicmp...その他あります)
  • 可変文字「type」(TCHAR)文字列の場合: _tcscmp_tcsicmp(および「カウントされた」バリアント:_tcsncmp_tcsnicmp...その他あります)

これらのプレフィックスを覚えておくことができます。

  • str->文字列
  • wcs->ワイド文字列
  • tcs->T文字列

補足:with#include <tchar.h>windows.hmacrosは同等でTEXTあり_T、ビルド時の定義に応じて「ANSI」またはUnicodeのいずれかになる文字列リテラルを宣言するために使用されます。同じことが当てはまり_TCHARTCHAR明らかに、後者はWin32APIコンテキストで好まれているようです。

したがって、Unicodeビルドはに拡張_T("something")されL"something"、「ANSI」ビルドはに拡張され"something"ます。

TCHARに関しては、次のような議論を読むことを検討してください。TCHARはまだ関連性がありますか?( rubenvbによって指摘されています) TCHAR/使用には賛成と反対の有効なポイントがあり_TCHAR、決定を下し、それに固執する必要があります-つまり、一貫性があります。

于 2012-07-11T17:21:37.980 に答える
0

気にしないでください。

if (wcscmp(argv[1], L"-foo") == 0)
于 2012-07-11T17:11:18.433 に答える