0

ワイド文字列の先頭のスペースをスキップするには、クロスプラットフォーム コードが必要です。g++ (および Qt は明らかに) はワイド文字列のスロットをまったく初期化しないようです。したがって、次のコードは VC++ では正常に動作しますが、ほとんどの g++ は bad_cast 例外で失敗します。

#include <string>
#include <locale>
#include <iostream>

int main()
{
    typedef std::ctype<std::wstring::value_type> vtct;
    std::wstring str=L"      1122";
    const std::wstring::value_type* unspace = 
        std::use_facet<vtct>( std::locale::classic() ).
            scan_not(std::ctype_base::space|std::ctype_base::punct, 
            str.c_str(), str.c_str() + str.length());
   //std::cout << unspace << std::endl;
   wprintf(L"{%s}\n", unspace);
   return 0;
}

仕様によると: 「ロケール オブジェクトのファセット リポジトリに、要求された locale::id のファセットが含まれていない場合の bad_cast 例外」

では、g++ がワイド文字列をどのように扱うのかという一般的な質問はありますか? より狭い質問 - 少なくとも ctype のファセットを初期化する方法は?

更新: いくつかの実験の後、Linux g++ がワイド文字列のファセットを正しく初期化することを発見しました。そのため、コードは機能します。説明されている問題は、mingw のみの場合の機能です。

4

2 に答える 2

1

MingGWを使用していますか?それらの安定バージョンはwchar_tをサポートしていません

Linuxのg++では問題なくC++ワイド文字サポート(ファセットも)を使用しています。

ただし、MinGWで動作するには、コードでナロー文字のみのコンパイルモードをサポートする必要がありました。

于 2009-09-22T10:24:51.977 に答える
0

STL ローカリゼーション サポートを使用しないようにしています。理由は次のとおりです。

  • それは複雑です
  • 私が知る限り、コンパイラのサポートはあまり良くありません。

Qtについて言及したので、wstringからQStringを作成して、QChar::isSpaceでどの文字がスペースであるかを確認できます。

C++ ローカリゼーションの詳細については、このリソースを参照してください。ローカリゼーションに関する B.Stroustrup の付録へのリンクが含まれています。

于 2009-09-18T17:51:23.807 に答える