sscanf函數引起android 5.0卡死,C++中慎用C庫函數

來源:互聯網
上載者:User

標籤:

為了準備即將到來的面試們,把以前的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庫函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.