質問: 現在C++を勉強しております。 下記のコードを動作するように書き換える必要があるのですが、 初心者の為、PUNICODE_STRINGをどう捌けばいいのかがわかりません...。 PUNICODE_STRING型でなく、string型に変換できれば動作することまでは理解しました。 PUNICODE_STRING型とはどのようなものなのでしょうか。(「C++ PUNICODE_STRING」等で検索しましたが有用な情報がどれであるのかよくわからない状況です。) string型に直す方法、またはPUNICODE_STRING型のものを「半角英数字のみであるか」判定する方法はありませんでしょうか。 ※追記 PUNICODE_STRING Passwordはプログラムを動作させると自動で取得するようなシステムになっています。(該当部分のプログラムは諸事情によりお見せできません...申し訳ございません...) PUNICODE_STRINGを使用している部分のプログラムのみ追記しました。 下記コードを書き換えて「14文字以上30文字以下の半角英数字のみであるか」の判定を行いたいです。 ``` PUNICODE_STRING Password regex reg("^[0-9A-Za-z]+$"); smatch match; if (Password->Length >= 14 * sizeof(WCHAR) && Password->Length <= 30 * sizeof(WCHAR)){ if( regex_search(Password, m4, r5) ) { return TRUE; } else { return FALSE; } }else{ return FALSE; } ``` 現在は、regex_searchに波下線がつき、 > > オーバーロードされた関数"regex_search"のインスタンスが引数リストと一致しません。 > > > と表示されています。 皆様のお力をお貸し頂けないでしょうか。 ※エラー内容画像の追記 ![エラー内容](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/f9c22f6fe63821cacdcc502d6665b078.png) 赤く囲った部分はお見せできない部分ですが、プロジェクト名が記載されます。
回答: PUNICODE_STRINGはWindows APIで定義されているUNICODE_STRING構造体のポインタ型ですね。 私は使ったことがありませんが、UNICODE_STRINGのリファレンスを見るとワイド文字列(WindowsではUTF-16)とその長さをひとまとめにしたものだと判ります。C/C++標準のwchar_t系関数・クラスで扱うことができます。 C++の`std::wstring`には、このようにして格納できます(※Lengthはバイト単位であることに注意) ``` std::wstring passwd(Password->Buffer, Password->Length / sizeof(WCHAR)); ``` 補足 文字列は`wstring`を使用しているので、正規表現クラスもワイド文字版の`wregex`と`wsmatch`をご使用ください。 追記 文字列全体がマッチするかどうかを調べるだけなら、search系ではなくmatch系のクラスを使った方が簡単です。また、「何文字から何文字」というようなことも正規表現でできます。 こんな感じ ``` bool match = regex_match(passwd, wregex(L"[0-9A-Za-z]{14,30}")); ```