sscanf関数はandroid 5.0のカード死を引き起こし、C++の中でCライブラリ関数を慎む

4360 ワード

面接の准备をするために、以前のRPGアイテムを取り出して携帯にインストールして走って、ゲームが詰まって死ぬことに気づいて、まるで気がふさいでいます..
当初私がこのプロジェクトを書き終わったとき、android 5.0はまだ発表されていませんでした.android 2.3からandroid 4.4までの設備でテストに合格しました(貧乏な私として、自分の携帯電話は2.3です).今やっと携帯を交换して、CM 12(android 5.0.2)をブラシして、やはりバグが现れて、ゲームは莫名卡死..
1時間テストして、やっと1つのファイルを読み取る関数の中にエラー範囲をロックして、それから少しずつ注釈関数の中のいくつかの行、最終的にsscanf関数がカード死の問題を引き起こしたことを発見して、修正は簡単ですが、エラーを発見する過程で多くの時間を浪費して、自分を警戒することしかできなくて、後でC++をする時Cライブラリ関数を慎むようにしましょう.
こんなに長いツッコミを入れて、最後に解決策を書いてみましょう.簡単ですが.
周知のように、sscanfの機能は、1つの文字列(char*)からデータをフォーマットすることであり、例えば、
1 const char* str = "10 3.14 haha";

2 int x;

3 double y;

4 char z[1024];

5 sscanf(str, "%d %lf %s", &x, &y, z);

6 printf("%d %.2lf %s
", x, y, z);

このコードは「10 3.14 hahaha」を出力します.
それに対応して、文字列に出力される関数sprintfをフォーマットして、使い方が似ているので、詳しくは言いません.
これはCライブラリの関数ですが、C++で対応するのはどうすればいいですか?stringstreamでできますが、実はこの2つのCライブラリ関数よりも簡単な使い方なので、Cライブラリ関数を使う必要はありません.stringstreamで上のコードを書き換えると、次のようになります.
 1 #include <sstream>

 2 #include <iostream>

 3 #include <string>

 4 

 5 using namespace std;

 6 

 7 int main() {

 8     const char * str = "10 3.14 haha";

 9     stringstream stream;

10     stream << str;

11     int x;

12     double y;

13     string z;

14     stream >> x >> y >> z;

15     cout << x << " " << y << " " << z << endl;

16     return 0;

17 }

1つのstringstreamを複数回使用するとstreamが呼び出されます.str(「」)未読み出しのストリームを空にし、streamを呼び出す.clear()を使用してエラータグをクリアします.
NDKは本当に脆弱だと感じて、いつもGCCとVSですべて警告のコードがないことに出会って、androidの上できらめいて退いて、もともと正しいコードをデバッグするのは本当に楽しいことではありません.の