質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.06%

C++におけるStringの変換について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,208

Alice0225

score 190

現在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"のインスタンスが引数リストと一致しません。

と表示されています。
皆様のお力をお貸し頂けないでしょうか。

※エラー内容画像の追記
エラー内容
赤く囲った部分はお見せできない部分ですが、プロジェクト名が記載されます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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を使用しているので、正規表現クラスもワイド文字版のwregexwsmatchをご使用ください。


追記
文字列全体がマッチするかどうかを調べるだけなら、search系ではなくmatch系のクラスを使った方が簡単です。また、「何文字から何文字」というようなことも正規表現でできます。

こんな感じ

bool match = regex_match(passwd, wregex(L"[0-9A-Za-z]{14,30}"));

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/20 17:04 編集

    ご回答ありがとうございます。
    「マルチスレッド (/MT)」設定になっていた為「マルチスレッド デバッグ (/MTd)」へ変更したところ、無事ビルドでエラーが発生しなくなりました!
    追加で一つ質問させていただけるとありがたいのですが、再度リリースでビルドする際は設定を元に戻す必要があるのでしょうか?

    キャンセル

  • 2016/01/20 17:21

    Release構成とDebug構成の設定はそれぞれ別々に分けて保存されているため、構成の切り替えで設定を書き換える(元に戻す)必要はありません。

    キャンセル

  • 2016/01/20 17:28

    わかりやすくご教授頂きありがとうございました。
    おかげさまで問題を全て解決することが出来ました!
    私もこれからもっと勉強して知識をつけていきたいと思います。
    本当にありがとうございました。

    キャンセル

+1

こんにちは。

MSDNに説明がありました。
また、Windowsの "ワイド" 文字はUTF-16です。

string型に直す方法、またはPUNICODE_STRING型のものを「半角英数字のみであるか」判定する方法はありませんでしょうか。

UTF-8ならstring型で表現できるのでUTF-8へ変換するのも手ですが、なかなか面倒です。
ですので、直接「半角英数字のみであるか」を判断した方が良いと思います。確かASCII文字については同じ値になりますので、単純に1文字づつ(1文字=2バイトなので注意)isalnumで判定すればできると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/20 10:31

    なるほど…
    勉強になります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る