標籤:
為了準備即將到來的面試們,把以前的RPG項目拿出來安裝到手機上跑了跑,發現遊戲會卡死,簡直鬱悶。。。
當初我寫完這個項目的時候,android 5.0還沒有發布,我在android 2.3到android 4.4的裝置上都測試通過了(作為窮逼的我,自己的手機就是2.3。。),現在終於換手機了,刷了CM12(android 5.0.2),果然出現bug了,遊戲會莫名卡死。。。
測試了一個小時,終於把錯誤範圍鎖定在一個讀取檔案的函數中,然後一點一點的注釋函數中的某些行,最終發現是sscanf函數引發了卡死的問題,雖然修改很容易,但是在發現錯誤的過程中浪費了不少時間,只能是警惕自己,以後做C++的時候慎用C庫函數吧。。
吐槽了這麼長,最後寫一下解決辦法吧,雖然很簡單。。
眾所周知,sscanf的功能是從一個字串(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\n", x, y, z);
這段代碼會輸出 "10 3.14 haha"。
相應的,還有格式化輸出到字串的函數sprintf,用法相似,就不細說了。
這是C庫的函數,在C++中對應的應該怎麼做呢?可以用stringstream做到,其實用法比這兩個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 }
多次使用一個stringstream時,調用stream.str("")清空未讀取的流,調用stream.clear()來清楚錯誤標記。
感覺NDK真的很脆弱,經常遇到用GCC和VS都毫無警告的代碼,拿到android上就閃退,調試原本就正確的代碼真的不是一件愉快的事情。。。
sscanf函數引起android 5.0卡死,C++中慎用C庫函數