- ベストアンサー
C++,CGI文字コード変換
簡単な質問ですみませんが宜しくお願いいたします。 現在、C++で不正文字が入力された場合、 不正文字を空白に置き換えてコードを無害化する変換処理を行っています。 《変換文字》 \,;,\n,\t,",' 《変換に使用している関数》 strstr(変換前char,変換後char) 変換前char文字として、 \については、"\\" "については、"\"" 'については、"\'" と置き換えて、マッチングをかけるようにしていますが、 \だけは、どうしても変換処理がうまくいきません。 どうすればよろしいでしょうか? 教えてください。宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
わたしがよくやるパターンとして str:=検索対象文字列 const char chrset = "\r\n\t \\\""; // 消したい文字 while(1) { char *p; if(NULL == (p = strpbrk(str, chrset))) break; *p = 0x7f; // DELコード } とか。 うちのライブラリではDELコードを無視するので… まあその辺は適当に。
その他の回答 (2)
- gooqoo_1972
- ベストアンサー率57% (12/21)
ソースがないと分かりません。 自作の変換関数ですか?ライブラリの変換関数ですか? MFCですか?
- rinkun
- ベストアンサー率44% (706/1571)
strstrって標準ライブラリの関数だよね。単純に部分文字列を探すだけで文字列の置き換えができるような関数じゃなかったと思うけど。 \や"や'はそれぞれ一つの文字なので'\\'、'\"'、'\''としてstrchrで該当文字を探せば良いのでは? あるいはstrcspnを使えば排除したい文字を同時に探せると思うけど。
お礼
回答くださいましてどうもありがとうございます。 また、説明不足で大変申し訳ございません。 ご指摘いただいたとおり、 strstrの関数では、文字列探索のみを行っています。 その後、memmove関数を用いて 文字列の変換を行っています。 実際には、 // 文字列探索 while( (hit = strstr("変換したい文字列","\\")) != NULL) // 文字列のシフト処理 // 空白に置き換え memmove(hit, "", (変換後文字列-変換前の発見文字列)) というような具合に処理を書いております。 '\\'で文字列の探索を行っているのですが、 実際に変換されているかどうかを 確認してみると、 hidden項目には、\が入った状態になってしまいます。 (※"や'は、空白に置き換えられて、削除されています) 同じように、\のエスケープ文字を付加して書いているのに \だけうまくいかない理由がよくわかりませんが、 strcspnや、strchrは、まだ試していないので 早速それで行ってみようと思います。 どうもありがとうございました。
お礼
rentahero様 皆様 ご回答くださいましてありがとうございます。 いろいろと試し、 何とか文字変換ができるようになりました。 やはり、今更ですが、ポインタを理解しないことには 何も始まらないことを実感いたしました。 結局、 「\\」については、 その他の文字検索で使用している strstr標準関数ではなく strchrで'\\'で検索するようにしました。 strpbrkを使用してみましたが、 私の能力の足りなさから、 発見した箇所からうまくポインタを回せず 発見した不正コード以降の文字列が 削除されてしまいましたので、 strcpyを使用することにしました。 おかげで、 文字列「><abcde'fghijk\」というように 不正な文字コードが複数含まれていた場合も 「abcdifghijk」 と置換できるようになりました。 strcpyを使用した場合、 セキュリティ面でBOF攻撃などにあうなどの 問題が発生するのではないかとも 言われましたが・・・ 今は調査中です。 とりあえず、 不正文字が複数含まれていた場合も 正常に置換できるようになりました。 皆様の温かなコメントのおかげです。 ありがとうございました。