[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 04/29 14:24 / Filesize : 158 KB / Number-of Response : 773
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】STL(Standard Template Library)相談室 10



1 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:01:17 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 9
pc11.2ch.net/test/read.cgi/tech/1204045410/

過去ログ・リンク・書籍紹介は >>2 以降

331 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:19:34 ]
>>328
規格ではmapにoperator[]を適用した場合もしそのキーが
存在しない時はデフォルトのコンストラクタで初期化される
決まりになってるからint()、つまり0から始まる

332 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:22:43 ]
>>329
23.1.7


333 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:25:49 ]
>>330
どの辺を混同していますか?

334 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:25:53 ]
>>332
サンクス
これは目から鱗だ

335 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:23:33 ]
iteratorの位置を動かすとき
++it とかするけど it+=8 のような感じで8個分移動する方法はないの?

336 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:26:55 ]
>>335
advance

337 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:27:32 ]
もちろん、ランダムアクセス可能なイテレータはit += 8で平気。

338 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:36:44 ]
listなのでループで回すしかないか

あと、ある値を持つコンテナを検索する関数を作ったのだが
見つからなかった場合NULLを返そう思ったら
itにNULL代入できない。しかも it ==0とか演算も不可
このような場合みんなはどうしてるん?

339 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:40:21 ]
>>338
end返すのはいやなのか?



340 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:47:32 ]
thx、打開した

341 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:25:09 ]
そもそもfindでいいんじゃね

342 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:28:59 ]
stlportのhash_mapにお尻から回す奴はないですか?

343 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:33:23 ]
イチジク浣腸はどうだ

344 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:53:29 ]
rbegin() rend()

345 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:49:22 ]
叙述関数には引数わたせないの?
find_if( List.begin(), List.end(), compare( 引数1 、 引数2 ) );

346 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:56:09 ]
ファンクタを使えばいくらでも。

347 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 16:02:53 ]
>>342
vcのstdext::hash_mapならreverse_iteratorがあるぞ

348 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:51:20 ]
VC2008とSTLpらすか5.1.7ですけど
_STLP_USE_STATIC_LIBを指定すると
↓と言われてリンクできません。
ファイル 'stlportstld_statix.5.1.lib' を開くことができません。

stlportstld_static.5.1.libならあるんですけど。バグですか?

349 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:02:22 ]
ren stlportstld_static.5.1.lib stlportstld_statix.5.1.lib



350 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:12:47 ]
#define _STLP_NEW_PLATFORM_SDK 1

351 名前:デフォルトの名無しさん [2008/11/08(土) 12:18:23 ]
VB6からVC++2005にプログラムを移植してるんですが、
下記の処理がVB版に比べてVC++版では50倍ほど時間がかかりました。
1から順に使われていないID番号を探すアルゴリズムで、内容は全く同じですが、なぜでしょうか?
m_itemは構造体配列で、要素数は600個程度です。
VC++のstd::vectorの実装はクソすぎなんでしょうか?

■VBの処理

Dim i As Long, j As Long
For i = 1 To 65535
 For j = 0 To m_item_num - 1
    If m_item(j).id = i Then Exit For
 Next
  If j = m_item_num Then
   get_new_item_id = i
   Exit Function
 End If
Next

■VC++の処理

size_t i, j;
for( i= 1; i< 0xFFFF; i++ ){
 for( j= 0; j< m_item.size(); j++ )
   if( m_item[j].id == i )  break;
 if( j == m_item.size() )  return i;
}

352 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:36:59 ]
>>351
const size = m_item.size();
for(j = 0; j < size; ...

キミのままだと、jのループ後とにm_item.size()関数が評価される。

353 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:47:16 ]
VC2005だとm_item[j]が毎回範囲チェックされてる
vector使う前に
#define _SECURE_SCL 0を入れると良い感じらしい

あと、まさかとは思うけどDebug版じゃなくて
Release版で実行してないとかはないよね?


354 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:58:48 ]
そもそもループを1重に直したら(VBでもC++でも)もっと速くなると思う。

355 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:59:39 ]
setでも使えばいいのに、とも思った

356 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 13:01:24 ]
VBは知らないけど、C++のただの配列とvectorとでも50倍も差はないから、なんか他の要因で遅くなってると思われ。

357 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 13:02:15 ]
あーごめんそれは無理か

358 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:00:46 ]
終了条件おかしくないか?

359 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:07:46 ]
351ですが、

>>352が主な原因だったようです。>>353でも多少改善しました。
二重ループをやめて、qsort()でもしてから一重ループで探すというのもいいかもしれませんが、
アルゴリズムを変更しないとVBより遅くなるというのは腑に落ちませんね。

ベクターは使い方次第でパフォーマンスに劇的に影響するようで、なんか怖いです。



360 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:24:53 ]
VC2008のvectorで
if (int i = 0; i < tbl.size(); i++) tbl[i] ・・・
みたいな使い方と、
配列で、
if (int i = 0; i < TBL_SIZE; i++) tbl[i] ・・・
みたいな使い方をした場合、
Debugビルドで最適化なしだと数十倍の差で、Releaseビルドで、最適化ありだと、二倍程度の差だった。

361 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:26:01 ]
このスレ的にはiterator使おうぜ

362 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:31:04 ]
>>359
VB知らないんだけど、この場合のm_item_numってなに?
それ次第では、そもそも「内容は全く同じ」という認識が間違ってたことに。

363 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:35:47 ]
VBとコードが違わないか?
>for( i= 1; i< 0xFFFF; i++ ){
for( i= 1; i<= 0xFFFF; i++ ){

調べてる要素が違ってるなら50倍違ってもおかしくはないけど。
あとは計測時間が短すぎて時間を計ってるタイマーの精度の違いが出てるとか
とりあえず>>351のコードをReleaseビルド&_SECURE_SCLでコンパイルしてVBより50倍も遅いなんてことあり得ないだろ。

364 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:53:51 ]
>359
ちゃんと最適化かけたか?

365 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:06:10 ]
STLがVBに負けるなんて悔しい ビクンビクン

366 名前:351 mailto:sage [2008/11/08(土) 15:08:04 ]
すみません。デバッグビルドになってたようです><
なんかデバッグなしにしたり最適化とかするとエラーが出てコンパイルできなかったので、何となく諦めてました。
>>359をやった上で最適化まですると、VBより速くなりました。
めでたしめでたし。

367 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:10:02 ]
しね

368 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:12:42 ]
まさにVB脳

369 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:14:42 ]
二重ループのかわりにstd::find_ifを使ってみようぜ!
あと上で言ってる人もいるけどsortするならむしろstd::vectorのかわりにstd::setを使おうぜ
Itemがidをもつぐらいなら用途にあってる可能性高いし




370 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:20:36 ]
VBでもデータ構造を変えれば劇的に速くなるな。

371 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:27:41 ]
>>369
ちょっとよく分かりませんが、勉強してみます。
今はVBのコードをC++にツラツラ置き換える作業だけをやってます。

VBの配列 → std::vector
VBのString → std::string

という置き換えで、今のところこれ以上のSTLの知識はありません。
アルゴリズムを下手に変えると、新たにバグが混入することになるので。

372 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:33:36 ]
VB6と一緒に心中してくれよ。こっちくんな。

373 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:40:28 ]
移植させてもらえるだけでも素晴らしいことだと思わないか。

374 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:44:24 ]
つうか既にバグ混入しててワロタ
>for( i= 1; i< 0xFFFF; i++ ){

375 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 16:03:45 ]
findを使って作ってみました

enum { N = 600, ID_MAX = 0xffff };

template<typename ID> struct Compare {
Compare(ID i) : m_i(i) {}
template<typename T> bool operator()(T const& i) { return i.id == m_i; }
private:
ID m_i;
};

template<typename ID, typename Container>
ID find_uniq_id(Container const& m) {
typename Container::const_iterator m_end = m.end();
for (ID new_id = 1; new_id <= ID_MAX; ++new_id) {
if (std::find_if(m.begin(), m.end(), Compare<ID>(new_id)) == m_end)
return new_id;
}
throw std::domain_error("new_id must not be beyond ID_MAX");
}


376 名前:375 mailto:sage [2008/11/08(土) 17:05:13 ]
id_typeとget_idを特殊化することによってより流用できるようにしてみました
参照の参照が怖いのと面倒臭いのが難点だと思いました

template<typename T> struct id_type { typedef typename T::id_t type; };
template<typename T>
typename id_type<T>::type get_id(T const& x) { return x.id; }
template<typename T>
struct Comparator {
typedef typename id_type<T>::type ID;
typedef bool result_type;
Comparator(ID i) : m_i(i) {}
bool operator()(T const& i) const {
return get_id<T>(i) == m_i; }
private:
ID m_i;
};
template<typename ID, typename Container>
ID find_uniq_id(Container const& m) {
typename Container::const_iterator m_end = m.end();
for (ID new_id = 1; new_id <= ID_MAX; ++new_id) {
if (std::find_if(m.begin(), m.end()
, Comparator<typename Container::value_type>(new_id)) == m_end)
return new_id;
}
throw std::domain_error("new_id must not be beyond ID_MAX");
}

377 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 17:39:34 ]
これはひどい

378 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 18:08:48 ]
なんというオナニー

379 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:37:20 ]
数値を文字列にするには
ostringstream を使用する方法がメジャー?



380 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:39:59 ]
>>379
たぶん sprintf を使う人のほうが多い。
snprintf が C++ 標準に入ればさらに増えるかもしれない。

結果を string で使うことや安全性を考えれば ostringstream のほうが良いとは思うけど。

381 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:54:15 ]
sprintfはchar確保するの面倒だとおもうけど
利用者が多いのは何か理由があるの?

382 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:55:45 ]
>>381 C からの移行組。

383 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:10:24 ]
Exceptional C++ Style でstringstreamはsprintfに比べて
だいたい10倍くらい遅いと書かれていた。

384 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:30:02 ]
速度的な点もあるけど
printf系というのは非常に多くの言語で(Win32にはAPIもある)用意されていて
細部の違いはともかく、知っている人が多い、使い方を覚えて無駄にならない、
というのもある。

C++だけの世界だけで見れば型安全性の無さ等非難される面も多いし
「C++らしくない」という良くわからない理由で嫌う人も。
また、(よく知らない人に多いが)セキュリティ等の面で問題があると言い張る人も居る。

385 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:54:57 ]
書式の設定がめんどくさい上に、長くなってしまう気がするんだが俺の書き方悪いのかな

386 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 04:07:58 ]
>>385
stream のことなら、たぶんそんなもん。

そういえば C++0x でもこの点は特に改善されたような話を聞かないな。
boost の io state saver ぐらいは入ってもよさそうなもんだと思うけど。

387 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 10:57:41 ]
>>379
boost::lexical_cast を使うがよい
結局 stringstream 使ってるんだけどな

388 名前:デフォルトの名無しさん [2008/11/09(日) 11:53:14 ]
>>381
char確保しなくてもいいよ。

std::string str;
int a = 123;

str.resize(256,0);
sprintf((char*)str.c_str(), "%d", a);
str = str.substr(0, str.find('\0'));


389 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:04:57 ]
stringにconst_castか…



390 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:06:07 ]
c_strの間違いw

391 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:23:41 ]
>>388
c_str() の戻り値に無理やり書き込んでも反映されるとは限らんよ
っていうかconst外して書き込むなんて無茶苦茶にもほどがある

392 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:24:08 ]
#include <vector>
#include <cstdio>
#include <iostream>

int main(int, char *[])
{
std::vector<char> buf(0xff, 0);
int n=10000;
std::sprintf(&buf.front(), "%d", n);
std::cout << static_cast<const char*>(&buf.front()) << std::endl;
return 0;
}

なるへそ

393 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:27:03 ]
printf系はセキュリティ面で問題あると思ってたが

問題ないの?

394 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:29:46 ]
const外し
か、漢だ!

395 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:30:56 ]
nの型がintでlog10(n)が100や200にもなるアーキテクチャがあれば教えて欲しいものだ

396 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:41:02 ]
string使おうがvector使おうが
スタック上に領域確保してれば
char配列となんら変わらん

397 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:46:24 ]
>>396
大概はそうだが、規格には反するな

398 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:07:49 ]
>>393
使い方の問題。
ユーザー入力をフォーマット文字列に使おうとする大バカと
最大文字数の指定方法を知らないバカがそう言ってるだけ。

399 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:18:32 ]
>>398
具体的に何の関数を言ってるかわからんけど、
すくなくともsprintfはあぶない



400 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:28:49 ]
一般的にやるべきでないとされていることを「だって出来るじゃん」の一言でやってしまう・・・

くせぇーっ! DQN以下の臭いがぷんぷんしやがるぜぇーっ!

401 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:31:44 ]
>>399
具体的にどこが危ないのか教えてよ

「使い方を間違えたら危ない」というレベルの話なら
「listen()を使う全てのプログラムは危ない」というのと同じになっちゃうから

402 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:39:40 ]
>>401
え?最大文字数を指定できないじゃん

それが危険だと思えないならまぁ好きにするといいよ

403 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:42:38 ]
sprintfで100byteのバッファしか取っていないのに、
100文字以上有るかもしれないユーザ入力を与えるとかね。

404 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:44:11 ]
VCのsprintf_s使ってます(^^)

405 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:46:22 ]
ハア?

char buff[100]
sprintf(buff, "%.80s", user_input);

これのどこが危ないって?

406 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:47:28 ]
まさしく>>398の最下行に書いてあるバカが言ってるとしか思えないんですけど。

407 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:48:08 ]
C++ で何で sprintf なんて使ってるのん?
しかも STL スレで・・・。
ostringstream か boost::format を使っとけ。

408 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:00:20 ]
>>405
そういうことを分かって使う分にはいいけど、
実際に使う人間が必ずしも分かっているとは限らないし、
分かっていても、うっかりやってしまう危険性があるよね。

409 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:04:25 ]
つうかそんな単純なケースならいいけど、
色々出力したりロケールが絡むと出力結果の予想がしんどいだろ



410 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:08:01 ]
そんなレベルなら、「vectorで[]は使わないほうが良い。at()を使え。」と同じじゃないの。

特に>>399はわざわざ>>398に対して言ってるんだから
もっとちゃんとした危険性を指摘してくれても良さそうなもんだけど。

そりゃ、切捨て前提という仕様は良くないとか
全部生かすつもりならsnprintfの方が楽だとか言うのはその通りだけど
それとセキュリティ的な問題は全く別だから。

柔軟性だって例えば
std::vecotr<char> buff;
buff.resize(???);
sprintf(&buff[0], "%.*s", buff.size()-1, str);
のような使い方である程度確保できるし。

>>409
「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。

411 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:13:43 ]
>>410
> 「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。
この一行が>>409の話とは全く別の話なのは、そういうジョークなの?

412 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:14:33 ]
ostreamが状態を持ってるのもしんどい

413 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:14:53 ]
あ、別にユーザー文字列をそのまま配列に落とす場合に限らないよ。

そもそも(1箇所での)ユーザー入力なんて、普通は1つなんだから
例えば
sprintf(filename, "file-%.80s%d.dat", input, num);
のような形式でも、充分に最大値は予想できるし。
あ、「intが512bitの環境を考慮すると面倒」というのはその通りか。

414 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:17:55 ]
使い難さが有るということは、ミスり易いってことじゃね?
ミスってもセキュリティ的な問題が出ないライブラリならいいんだけど。

415 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:19:43 ]
いわゆる、バグというものは、ミスることによって起こるんだから。
十分予想出来るとかで大丈夫じゃないか、なんていい方出来るだったら、
世の中の全てのソフトウェアにはバグが無いってことも言えてしまう。

416 名前:409 mailto:sage [2008/11/09(日) 14:19:58 ]
>>410

いやだから
出力結果の予想が困難→バッファ長の予想が困難
セキュリティ的にあぶなくね?
という話し

気をつけて使え
って話しなら
そうですね
としか言えないけど

みなミスりがちだからsnprintfとかVC++のセキュア関数とか
あるんじゃないの?

417 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:32:40 ]
いやだから
全然>>398への反論になってない。
「使い方を知らないのが問題」なだけでは
「セキュリティ的に問題がある」ということにはならないから。
まあ、416の言いたいことはもっともだし
他にもっと良い選択肢があるならそちらを使うべきなのは確か。
でも残念ながら標準ではない。


ただ、自分が「使い方を知らないバカ」だという自己紹介はもういいよ。
>>398の最下行を無視して>>402と反論するような人が>>399みたいに書くわけだから。

418 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:35:28 ]
あ、それと、「最大値の見積もりを間違える」点についてだけど

別に用意したバッファの95%以上まで使わなければいけない、というような決まりはないから。
多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。
例えば>>405のようにね。

419 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:37:36 ]
>多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。
ええええー



420 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:38:20 ]
最大量がきっちり分かってる状況じゃないかそれでいけるのは

421 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:41:24 ]
は?
当然過ぎて困りますが
ユーザー入力の部分の最大量は>>405のように制限して
その上で他の部分の見積もりが多少違っていても大丈夫なように
ということですけど。

422 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:42:37 ]
ユーザー入力の部分の最大値を制限するのは
当然というか大前提だと思っていましたが、皆さんは違うのですか。
認識の違いですね。

423 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:44:22 ]
つまり、%fは使うなってことですね、判ります。

424 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:48:54 ]
あー、sprintfは使い方が難しくセキュリティ的な問題を起こしやすいので使うべきではない。
とすると、

同じように、
使い方が難しくセキュリティ的な問題を起こしやすいものは使うべきではない
ということになりますね。

つまり、
C++をやめましょう、と。
Javaあたりがよろしいでしょうか。
実際、世間の潮流もそういう流れになってますしね。

425 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:49:50 ]
>>423
%.fを使ってください

426 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:52:52 ]
>>425
sprintf(buf, "%10.0f", 1e100);

427 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:02:23 ]
snprintf()なら、
snprintf(s, sizeof(s), …
ってやっとけば安全だけど、
sprintf()は人間が数えないといけないじゃん。

>>405 見たいな単純なやつだったらどっちでもいいってことになるかもしれんけど、
書式が複雑になってくると、ミスる可能性がでてくるよ。

てか単純にsnprintf()のほうが楽ジャン。sprintf()で人間がバッファサイズ数えるなんて非合理。

428 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:04:36 ]
いつまで STL スレで sprintf の話をやってんだよ。
そんな型安全じゃない C の糞遺物なんぞ C++ で使うな。

429 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:05:04 ]
だよな!



430 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:07:32 ]
>>426
printf("%.2u", -1);
の時に必ず2桁に収まると思う人は居ませんね。
これと同様に最大桁数が見積もれる点は変わらないと思いますが。
いや、最大桁数はbit数に依存するので環境依存ですけど。

>>427
だからsnprintfはC++においては非標準だって。
それに「sprintfはセキュリティ的に問題がある」という意味にはならないよ。
「C++はセキュリティ的に問題がある」というのと同様。

431 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:07:47 ]
ところで型安全って何ですか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<158KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef