为了准备即将到来的面试们,把以前的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上就闪退,调试原本就正确的代码真的不是一件愉快的事情。。。

更多相关文章

  1. android socket通信
  2. 第一行代码笔记1
  3. Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定
  4. 狂刷Android范例之3:读写外部存储设备
  5. Android底部弹出iOS7风格对话选项框
  6. Android(安卓)深入了解 Handler 和 Looper
  7. 那些年Android黑科技①:只要活着,就有希望
  8. Android通讯-Socket(TCP/IP)
  9. Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程

随机推荐

  1. 【Android(安卓)开发】:UI控件之 Menu 菜
  2. Android技术经理+资深工程师+研发工程师-
  3. TFT模块闪屏(Flicker)现象分析
  4. 向产品宣战——开发者眼中的Android(安卓
  5. Android基于cordova3.3的插件开发
  6. 安卓电子市场开放下载VMware View FOR AN
  7. Android(安卓)深入研究JNI
  8. Android(安卓)Camera详解
  9. Android消息机制源码解析(二)——消息的执
  10. GitHub上面非常受欢迎的android开源项目