私はどちらも一般的な文字列であるので、私は幾分互換性があると思われる2つのフォーマットを比較しようとしています。私は文字列とstd :: wstringを使ってstrcmpを実行しようとしましたが、C++達が知っていると確信しているので、これは単にコンパイルされません。これらの2つのタイプを比較することは可能ですか?ここに簡単な変換はありますか?文字列の比較。どのようにstd :: wstringと文字列を比較できますか? WRT strcmp
答えて
あなたのchar*
文字列に変換する必要があります - ISO Cの用語では "ワイド文字" - wchar_t*
文字列に - ISO Cの用語では "マルチバイトを"。それは、(「ワイド文字列にマルチバイト文字列」)mbstowcs
と呼ばれているん標準機能
注:スティーブはコメントで指摘したように、これはC99の機能であるため、ISO C++準拠ではありませんが、拡張としてC++の実装によってサポートされるかもしれません。 MSVCとg ++の両方でサポートされています。
したがって、使用されている:あなたは2 wstring
秒を持っていたら、ちょうどいつものように比較
const char* input = ...;
std::size_t output_size = std::mbstowcs(NULL, input, 0); // get length
std::vector<wchar_t> output_buffer(output_size);
// output_size is guaranteed to be >0 because of \0 at end
std::mbstowcs(&output_buffer[0], input, output_size);
std::wstring output(&output_buffer[0]);
。これは変換のために現在のシステムロケールを使用することに注意してください(Windowsの場合、これは現在の "ANSI"コードページになります)。通常これはあなたの望むものですが、特定のエンコーディングを扱う必要があることもあります。上記は行いません。iconv
のようなものを使用する必要があります。
EDITは
他のすべての答えは、直接コードポイント変換(文字列内のすべてのchar c
ため(wchar_t)c
のすなわち同等)のために行くように見えます。これはすべてのロケールでは機能しない可能性がありますが、たとえばchar
はすべてASCIIまたはLatin-1で、wchar_t
はUnicodeです。
#include <algorithm>
const char* s = ...;
std::wstring ws = ...;
const char* s_end = s + strlen(s);
bool is_ws_less_than_s = std::lexicographical_compare(ws.begin, ws.end(),
s, s_end());
bool is_s_less_than_ws = std::lexicographical_compare(s, s_end(),
ws.begin(), ws.end());
bool is_s_equal_to_ws = !is_ws_less_than_s && !is_s_less_than_ws;
あなたは、具体的平等をテストする必要がある場合は、長さチェックでstd::equal
を使用します:
std::lexicographical_compare
を使用することが実際にあります
#include <algorithm>
const char* s = ...;
std::wstring ws = ...;
std::size_t s_len = strlen(s);
bool are_equal =
ws.length() == s_len &&
std::equal(ws.begin(), ws.end(), s);
では動作しません。これはC++ですか?それはC99のようですが、どのバージョンのCライブラリがC++標準にマージされたのかよくわかりません。とにかくupvoted - 実際にいずれかの方法で動作する必要があります。 – Steve314
ええ、 'mbstowcs'はC99ですが、実際には私がよく知っているC++の実装 - MSVCとg ++ - がこの機能をサポートしています。 –
100%移植性のあるISO C++のアプローチは、 'std :: codecvt
あなたwstringのは、文字列に変換します。
wstring a = L"foobar";
string b(a.begin(),a.end());
これで、b.c_str()などの任意のchar *と比較できます。
char c[] = "foobar";
cout<<strcmp(b.c_str(),c)<<endl;
前の答えについて申し訳ありませんが、私はそれを変更しました。 – Jacob
データを失う可能性が少ないので、他の方法(つまり 'char *' - > 'wstring')を実行する方が良いでしょう。イテレータとして文字列に生ポインタを使用できます。しかし、そうでなければメソッドは同じで、コンストラクタを使う方が 'copy'を使う他の答えよりも優れています。警告は同じです:これはすべてのロケールで正しく機能しない可能性があります。 –
。まずあなたがANSIでのchar *(のCString)とUnicode形式でのstd :: wstringのを使用しているなぜあなたは自問する必要があり、すべての。ユニコードは、アプリケーションの国際化を可能にするため、使用することをお勧めしますが、ほとんどの場合、ミックスを使用することはあまり意味がありません。あなたのcstringをユニコードにするには、wchar_tを使用してください。あなたのSTL文字列がANSIであるようにするにはstd :: stringを使用します。
今質問に戻ってください。
最初に行うことは、そのうちの1つを他のデータ型と一致させることです。
std::string
std::wstring
がここ
機能は、私がどのようにwchar_tに、char *を変換する*およびその逆の手をオフに覚えていないが、あなたが行った後
const char* std::string::c_str() const
const wchar_t* std::wstring::c_str() const
を定義ですc_str機能を持っていますあなたはstrcmpを使うことができます。あなたがGoogleの場合は、方法を見つけるでしょう。
あなたははstdするのstd :: wstringのを変換するには、以下の機能を使用することができます::文字列は、その後c_strはあなたがchar型与える*あなたが迅速かつ汚い方法は
#include <string>
#include <algorithm>
// Prototype for conversion functions
std::wstring StringToWString(const std::string& s);
std::string WStringToString(const std::wstring& s);
std::wstring StringToWString(const std::string& s)
{
std::wstring temp(s.length(),L' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
std::string WStringToString(const std::wstring& s)
{
std::string temp(s.length(), ' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
これは、指定されたロケールのマルチバイトとワイド文字のエンコーディングが "互換"(例:マルチバイトが実際にはASCIIまたはLatin-1で、widecharがUnicodeである場合マルチバイトの場合は動作しません。 CP1251。 –
これは私がstackoverflowが好きな理由です。あなたが何かランダムなGoogleの結果に行く場合は、間違った答えを得るかもしれません。 – Ryu
あるのstrcmpできる
if(std::wstring(your_char_ptr_string) == your_wstring)
一時的な文字列を作成してyour_charをその中にコピーするので、ダーティと言います。しかし、タイトなループではない限り、正常に動作します。 wstringの16ビット文字(すなわちユニコード - 65536可能な文字)を使用すること
注チャー一方は* 8ビット文字(ASCII、ラテンのみ英語)になる傾向があります。それらは同じではないので、wstring - > char *は精度を失う可能性があります。
-Tom
これは私の考えよりよく見えます。何らかの理由でstd :: wstringに正しい変換がないと思いました。私のアプローチでは、2つの余分なオブジェクトが作成されます。名前のついたオブジェクト(単純なwstringよりも重いもの)と、一時的なwstringインスタンスです。 – Steve314
'std :: wstring'には' const char * 'のコンストラクタはありません。 –
charからwstringを構築できます*基になる型は異なります。 wstringはwchar_tを使用します(いくつかのシステムでは16バイトだけでなく32バイトかもしれません)。 –
- 1. strpos strcmpのPHP文字列比較
- 2. PHPの文字列比較
- 3. 文字列比較
- 4. 比較文字列
- 5. Optarg文字列比較C
- 6. 文字列とPHPの文字列を比較しますか?
- 7. 文字列の比較 - Java
- 8. Pythonの文字列比較
- 9. PHPの文字列比較
- 10. 文字列/パスの比較
- 11. DateTime、文字列の比較
- 12. Python文字列の比較
- 13. Java:文字列の比較
- 14. Javaの文字列比較
- 15. C++文字列の比較
- 16. グローブ文字列の比較
- 17. MD5文字列の比較
- 18. 文字列の比較C#
- 19. Ajaxの文字列比較
- 20. 文字列のブール比較
- 21. DXF文字列の比較
- 22. C++文字列の比較
- 23. C#の文字列比較#
- 24. C++文字列の比較
- 25. SAS文字列の比較
- 26. Qtの文字列比較
- 27. 文字列とfgetsとの比較
- 28. JavaScriptを比較文字列
- 29. 文字列の比較と文は
- 30. Java配列と文字列の比較
私は混乱しています。 2つのワイド文字列を比較しようとしていますか、ワイド文字列を通常の文字列と比較しようとしていますか? – jmucchiello
私は別のプログラムからマーシャリングされたファイルストリームからchar [256]が入ってきました。私はそれから、関数にパラメータとして渡されるstd :: wstringのファイル名と比較する必要があります(ファイル名を表します)。しかし、私は論理的にこれらを比較することはできません – Mark
これらの文字のエンコーディングに関する保証はありますか?システムロケールエンコーディングですか?いくつかの特定の既知のエンコーディング? –