- 1 名前:デフォルトの名無しさん [2006/12/26(火) 20:24:15 ]
- CString , string , wstringに負けないものをみんなで作ろうね。
前スレ: pc8.2ch.net/test/read.cgi/tech/1044098312/
- 183 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 18:25:18 ]
- >>33がリッチなのはわかる。
でも、ただGetBuffer/ReleaseBufferが面倒なだけだったら、単純なユーティリティクラスでいいんじゃない? class GR { CString str; size_t siz; LPTSTR p; public: ~GR() { str.ReleaseBuffer(); } GR(CString &str_, size_t size_) : str(str_), p(NULL), siz(0) { p = str.GetBuffer(size); siz = size_; } operator LPTSTR() { return p; } size_t size() const { return siz; } }; 多分こんな風に使えるはず。 CString s; { GR buf(s, 1000); GetCurrentDirectory(buf, buf.size()); } 思いつきで書いただけで、コンパイルもテストもしてないけど。
- 184 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 19:01:05 ]
- 何文字返ってくるか分からないがね〜
- 185 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 19:27:31 ]
- 受け取ったらそのまま、普通に持ち運びしたいよな、何も考えずに。
- 186 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 21:56:39 ]
- >>184
MSのプログラマですらオーバーフロー度々起こすってことはやっぱ問題があるんだよな。
- 187 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 22:02:05 ]
- safeiteratorを実装するしか
- 188 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 11:37:49 ]
- >>33のcapture_stringをパクればいいんでね?
class CaptureString { public: typedef char value_type; private: CString *target; size_t size; value_type *buffer; public: CaptureString(CString *target_, size_t size_ = DEFAULT_SIZE) : target(target_), size(size_), buffer(NULL) { } ~CaptureString() { if (buffer != NULL) { target->ReleaseBuffer(); } } operator value_type *() { if (buffer == NULL) { buffer = target->GetBuffer(size); } return buffer; } }; // 使用例 CString str; fgets(stdin, CaptureString(&str, BUF_SIZE), BUF_SIZE);
- 189 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:43:07 ]
- >>184,185
>>183のやつだったら、 for (GR buf(s); ! buf.enough(GetCurrentDirectory(buf, buf.size())); buf.grow()); みたいに書けるようにメソッド追加すればいいし、 >>188のやつだったら、 size_t BUF_SIZE = 100; while (GetCurrentDirectory(CaptureString(&str, BUF_SIZE), BUF_SIZE) >= BUF_SIZE) BUF_SIZE *= 2; とか書けばいい。
- 190 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 16:36:16 ]
- 結局、固定長バッファで長さ不明のもの受け取る時点で…
リトライすると結果が変わる場合もあるし。
- 191 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 15:18:41 ]
- 既出かもしれないけど
ttp://ast.qt-space.com/slibrary/sjstring.html 結構使いやすいと思った
- 192 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 15:41:17 ]
- >>191
意図しているのかしていないのか、コードはバグっているしドキュメントには不備があるし、windows.h必須だし……
- 193 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 15:53:14 ]
- Win32APIで可変長文字列が扱えて置換できるっていうの探してたら
ようやく見つかったから貼ってみた。 このスレ的にはナシなのか。 それでも、どこがバグってるか分からず使ってる幸せ脳なオレ ttp://ayusya.hp.infoseek.co.jp/ProgramCString3.html これは可変長文字列が使えないし、置換の処理が間違ってた。
- 194 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 15:53:35 ]
- const性を全く考慮していない辺り、アイタタタなのだが。
つまり、const SJStringを作ってしまうと殆ど(或いは全部か?)のメソッドが使えなくなる罠。 const SJStringから何かを検索することも、SJStringの検索文字列をconst SJStringで与えることもできやしない。
- 195 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 16:03:18 ]
- >>193
>191のメソッドの、parseInt()かisOnlyNumber()辺りを2バイト数字で試してみて。 >193のクラスも、>194の問題があるね。windows.hに依存しない分だけ使えそうだけど。
- 196 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 16:12:09 ]
- ずれてる…
100→211 999→333 になった。
- 197 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 16:18:41 ]
- 書き方が悪かった。parseIntでの結果
0 1 2 3 4 5 6 8 9 1 2 4 5 6 7 8 9 3 7が出てくると0になる。(678→0) ・・・変だね。
- 198 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 16:20:50 ]
- このスレに触発されて文字列クラス作ってるけど、疲れてきたよ。
char awstr[] = "あいaうえbおc"; typedef fixedstring<traits_SJIS> mystring; mystring fs(awstr); std::sort(fs.begin(), fs.end()); fs[3] = "字"; fs += 'Z'; std::string tmpstr = fs; traits_SJIS::char_type dd("そ"); if (dd == "そ"); out_iterator<sys2_to_ucs2> oi("てすとabc文字列"); wcout << with_nul(*oi)() << endl; fs.assign(oi); fs *= 3; wcout << fs;
- 199 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 16:55:55 ]
- >>197
parseInt()の実装を見てご覧。意図的なら兎も角、こんなバグを作りこむ香具師が信用できる?
- 200 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 17:01:25 ]
- >>199
どうやら数字を1から9まで数えられない人が作ったようです。 parseInt()だけ直して使おうかなと。 どうせ置換と可変文字列が使えればいいし。 そこだけならwindows.hもいらないみたいだし。 (一番大きな理由は自分では作れないという事)
- 201 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 17:06:08 ]
- >>200
バグっているのはそこだけじゃないから、充分注意してね。 # つーか、MBCSなら置換も楽なんだけど……
- 202 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 17:08:00 ]
- なんだろう。この無駄な中括弧の多さは…
文字列を修正して CString strNumber = __TEXT("-0123456789−0123456789"); その下のif文にコレ追加して else if (p == 11) { str += "-"; } if文の終わりのところを11にすればいいのかな。 str += strNumber.charAt(p - 11);
- 203 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 17:14:18 ]
- parseInt()が有るのにparseDouble()なんかが無いのも不思議。
ここらへん全部作ってあるクラスがあっても良さそう。 というか探せばありそう。また探してくるわ
- 204 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 12:36:32 ]
- 結局良いのは存在しないのか・・・
- 205 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:40:06 ]
- ほんとに「完璧」な文字列クラスを作ろうとすると、
・各種エンコーディングの相互変換 ・各種エンコーディングの自動判別 ・文字列←→整数、小数への変換 ・検索、置き換え(正規表現対応で) ・マルチバイト、ワイド文字(2バイト、4バイト両方)に対応 最低でもこれくらいは必要になるからめちゃくちゃ大変。
- 206 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:21:47 ]
- ヘッダーファイル一つインクルードするだけで使えるようなのがいいんだけどなぁ。
正規表現まで対応するとなるとかなりの量になるよね。
- 207 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:51:45 ]
- 当然イテレータで要素巡回できるようにしてほしいし、
ついでに、レンジやコンテナの要件も満たしていてほしい。
- 208 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:23:45 ]
- wstringのサロゲートなんとかするだけでもいいっすよ
- 209 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:29:08 ]
- そうするとchar_traitsだけじゃ足りないんだよな。
- 210 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:13:40 ]
- 海外のプログラマーはどうしてるんかね?
マルチバイトカンケーネーであまり気にしないんだろうか。 普段はstd::stringでも構わないんだけど GetWindowTextとか使うときに不便だから ここらへんを一まとめにしたようなのどこかにないかね。
- 211 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:07:59 ]
- 中国人とかも困ってるだろうにね。
- 212 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 18:58:13 ]
- >>210
今度の改定でstd::basic_string<>も vector同様に要素がメモリ上で連続されることが保証されるようになるらしい。
- 213 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:50:47 ]
- 中国人は字が読めるヤツは英語も読めて
英語出来ないヤツは字も読めないから問題ないんだよ
- 214 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:52:32 ]
- 国内向けアプリは普通中国語で作るんだろ?
- 215 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:24:57 ]
- それはどうかな
- 216 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 05:32:36 ]
- 仕事でパソコンを使う奴は英語でいいし、英語を読めない奴にパソコンを教えても使えないから問題ない。
- 217 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:28:31 ]
- ワープロやエディタのように英語が読めてもデータとして中国語を扱う必要もあるだろうに。
- 218 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:21:56 ]
- その場合は、中国語だけを扱えばいいから何の問題もない
- 219 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:04:42 ]
- アニメ「さよなら絶望先生」には
糸色 望(いとしき のぞむ) → 絶望 糸色 命(いとしき みこと) → 絶命 糸色 交(いとしき まじる) → 絶交 こういったネタが出てくるのですが、これって文字コードの正規化の一種ですよね? 人気アニメでも使われるくらいなので、かなりニーズのある処理だと思うのですが、 残念ながらこういった「文字の結合」ができるライブラリを寡黙にして知りません。 そこでお願いなのですが、是非新たな文字列クラスにはこういった機能をデフォルトで組み込んでもらえませんか?
- 220 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:40:08 ]
- >こういったネタが出てくるのですが、これって文字コードの正規化の一種ですよね?
いいえ。 >残念ながらこういった「文字の結合」ができるライブラリを寡黙にして知りません。 それを言うなら、「寡聞にして存じ上げません」でしょう。
- 221 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:41:52 ]
- 雲
雲雲 龍 ←これで一字 龍龍 >>これって文字コードの正規化の一種ですよね? >いいえ。
- 222 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:34:06 ]
- >>221
言葉遊びとごっちゃにしてませんか?
- 223 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:01:13 ]
- 糸色 = 文字コードの正規化
>>221 = 言葉遊び なぜそう言いきれるのか理由を説明してくれ。 コンピュータにも分かるように。
- 224 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:33:56 ]
- >>223
逆。 >219は言葉遊び。通称「絶望」先生は、本名「糸色望」なのだから。
- 225 名前:デフォルトの名無しさん [2008/02/18(月) 19:19:25 ]
- >>205
エンコーディングの自動判別機能については文字列クラスじゃなく、 フリー関数かlocaleを表現するクラスのメンバ関数に持たせるべきだと思う。 国際化された検索機能などを文字列クラス自体が持つとすると、 文字列はエンコーディングとバイト列の組になっているか、 あるいは特定の内部コードに正規化されているはずだけど 自動判別アルゴリズムの入力は「バイト列」と「エンコーディングの候補」になる。 これらを与えることが可能な場所はコンストラクタしかないが、 コード変換しないでエンコーディングだけ知りたい場合に困ってしまう。
- 226 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 01:58:32 ]
- きっと>>219が言いたかったのは
文字コードで悩むならいっそ画像化して画像解析すればいいじゃない ってことだろう。 無いな。
- 227 名前:219(本物) mailto:sage [2008/02/19(火) 18:01:30 ]
- 私の言いたかったことは
「言葉遊びで言葉遊びを説明する・・・ そんな言葉遊びを言葉遊び的に言葉遊びで言葉遊びするという 言葉遊びを言葉遊びしてほしい」 ということです
- 228 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:12:30 ]
- 縦読みも正規化だな
- 229 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:31:12 ]
- 俺は>>198ではないがオレ流に作ってみたので晒してみる
つ ttp://sij.dip.jp/strjp/ 話にならんってレベルだったらスルーしてくれ…
- 230 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 18:49:20 ]
- >>229
亀レスだが、文字コードによって文字列クラスを変えるのはどうかと思う。 内部フラグか何かでどうにかならんかな? こういうことがしたい) strjp sjis("Shift_JIS文字", encoding::sjis); strjp euc("EUC文字", encoding::euc); sjis = euc; euc = sjis.conv_to(encoding::euc);
|

|