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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

4340閲覧

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

Alice0225

総合スコア206

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2016/01/18 08:41

編集2016/01/20 06:42

現在C++を勉強しております。
下記のコードを動作するように書き換える必要があるのですが、
初心者の為、PUNICODE_STRINGをどう捌けばいいのかがわかりません…。
PUNICODE_STRING型でなく、string型に変換できれば動作することまでは理解しました。
PUNICODE_STRING型とはどのようなものなのでしょうか。(「C++ PUNICODE_STRING」等で検索しましたが有用な情報がどれであるのかよくわからない状況です。)
string型に直す方法、またはPUNICODE_STRING型のものを「半角英数字のみであるか」判定する方法はありませんでしょうか。
※追記
PUNICODE_STRING Passwordはプログラムを動作させると自動で取得するようなシステムになっています。(該当部分のプログラムは諸事情によりお見せできません…申し訳ございません…)
PUNICODE_STRINGを使用している部分のプログラムのみ追記しました。
下記コードを書き換えて「14文字以上30文字以下の半角英数字のみであるか」の判定を行いたいです。

C++

1 2PUNICODE_STRING Password 3 4regex reg("^[0-9A-Za-z]+$"); 5smatch match; 6 7if (Password->Length >= 14 * sizeof(WCHAR) && Password->Length <= 30 * sizeof(WCHAR)){ 8 if( regex_search(Password, m4, r5) ) { 9 return TRUE; 10 } else { 11 return FALSE; 12 } 13}else{ 14 return FALSE; 15}

現在は、regex_searchに波下線がつき、

オーバーロードされた関数"regex_search"のインスタンスが引数リストと一致しません。

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

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

退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PUNICODE_STRINGはWindows APIで定義されているUNICODE_STRING構造体のポインタ型ですね。

私は使ったことがありませんが、UNICODE_STRINGのリファレンスを見るとワイド文字列(WindowsではUTF-16)とその長さをひとまとめにしたものだと判ります。C/C++標準のwchar_t系関数・クラスで扱うことができます。

C++のstd::wstringには、このようにして格納できます(※Lengthはバイト単位であることに注意)

C++

1std::wstring passwd(Password->Buffer, Password->Length / sizeof(WCHAR));

補足
文字列はwstringを使用しているので、正規表現クラスもワイド文字版のwregexwsmatchをご使用ください。


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

こんな感じ

C++

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

投稿2016/01/18 09:26

編集2016/01/18 10:01
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alice0225

2016/01/20 01:32

一文で済ませることが出来てしまうのですね…。 コピペになってしまいますが、自身のプログラムに適用できるかテストしてみたいと思います。
Alice0225

2016/01/20 01:56

試しにプログラムを下記のように書き換えたところ下波線は出なくなりましたが、 ビルド時にエラーが発生します。 #include <windows.h> #include <ntsecapi.h> #include <regex> using namespace std; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ std::wstring passwd(Password->Buffer, Password->Length / sizeof(WCHAR)); bool match = regex_match(passwd, wregex(L"[0-9A-Za-z]{8,15}")); if (match == true) { return TRUE; } else { return FALSE; } 実行すると「外部シンボル"~~~~~"は未解決です」という旨のエラーが14件ほど 表示されてしまいます。
catsforepaw

2016/01/20 05:16

うーむ。よく判りません。C++標準ライブラリでリンクエラーが出ることは考えにくいのですが。 エラーの内容をもう少し詳しく教えていただけないでしょうか。
Alice0225

2016/01/20 06:41

エラー内容を質問に追記させていただきました。 ちなみにDebug設定でビルドすると表示されビルドに失敗し、Release設定でビルドするとエラー表示が出ずにビルドが成功で終わります。
catsforepaw

2016/01/20 07:06

判りました。ランタイムライブラリの指定がDebug構成に対してRelease向けの設定になっていることが原因です。 プロジェクトのプロパティを開いて、Debug構成で「C/C++」→「コード生成」の設定を開くと「ランタイムライブラリ」欄があるので、「マルチスレッド デバッグ (/MTd)」または「マルチスレッド デバッグ DLL (/MDd)」を指定してください。
Alice0225

2016/01/20 08:07 編集

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

2016/01/20 08:21

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

2016/01/20 08:28

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

0

こんにちは。

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

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

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

投稿2016/01/18 09:06

編集2016/01/18 09:07
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alice0225

2016/01/20 01:31

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問