C++ bug tips

系统: Linux 16.04 LTS
编辑器: vim
编译器:g++

  1. Segmenta Fault(段错误)
    概念是“当程序试图访问不被允许访问的内存区域(比如,尝试写一块属于操作系统的内存),或以错误的类型访问内存区域(比如,尝试写一块只读内存)。”
    一般段错误的原因有3个:

    • 数组或者内存越界啦,一定要注意边界啊。
    • 访问类型错误,数据类型不一致。比如非要访问一块只读内存,或者输出的时候类型错误。
    • 访问了不存在的内存,就是空指针啊。
  2. 标准输入流cin内容的判断
    当你读入的键盘输入的数据类型和要赋值的变量数据类型不一致时,输入不成功,这时可能需要用到这几个函数:

    • cin.fail():输入流错误,流坏掉了,期望读入int却读入了string。
    • cin.eof():读到了结束符,输入结束。
    • cin.get():读取单个字符,只能提取流里面的第一个字符,同时它也有删除这个流里的字符的作用。
    • cin.rdstate():如果输入的类型与变量类型无法匹配,那就会发生错误,cin里有个方法能检测这个错误,就是rdstate()。

      ios::iostate state = cin.rdstate();

      状态类型即标识符为:

      goodbit:无错误。
      Eofbit:已到达文件尾。
      failbit:非致命的输入/输出错误,可挽回。
      badbit:致命的输入/输出错误,无法挽回。

    • cin.clear() 用来搞清楚到底是出现了什么错误,即确定上一条的内部标识符

    • cin.sync() 确定标识符后,就可以用此函数来清空数据流。

    所以当读入一个值但是错误的时候,可以这样来重新读入:

    int a;
    while(!(cin>>a)){
    cin.clear();
    cin.sync();
    }
    //当同时读入多个数据时,可以这样重新读入:
    int a,b;
    while(!(cin>>a>>b)){
    cin.clear();
    while(cin.get()!=’\n’) continue;
    }

  3. sizeof()的坑
    用sizeof(array)来求一个数组的长度时,它返回的是类型的对象表示的字节数,即返回一个对象或类型所占的内存字节数,所以他与机器时32位还是64位有关。
    所以一个数组的实际长度应该是:

     sizeof(array)/sizeof(array[0])
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值