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*)からデータをフォーマットすることであり、例えば、
このコードは「10 3.14 hahaha」を出力します.
それに対応して、文字列に出力される関数sprintfをフォーマットして、使い方が似ているので、詳しくは言いません.
これはCライブラリの関数ですが、C++で対応するのはどうすればいいですか?stringstreamでできますが、実はこの2つのCライブラリ関数よりも簡単な使い方なので、Cライブラリ関数を使う必要はありません.stringstreamで上のコードを書き換えると、次のようになります.
1つのstringstreamを複数回使用するとstreamが呼び出されます.str(「」)未読み出しのストリームを空にし、streamを呼び出す.clear()を使用してエラータグをクリアします.
NDKは本当に脆弱だと感じて、いつもGCCとVSですべて警告のコードがないことに出会って、androidの上できらめいて退いて、もともと正しいコードをデバッグするのは本当に楽しいことではありません.の
当初私がこのプロジェクトを書き終わったとき、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の上できらめいて退いて、もともと正しいコードをデバッグするのは本当に楽しいことではありません.の