系统: Linux 16.04 LTS
编辑器: vim
编译器:g++
Segmenta Fault(段错误)
概念是“当程序试图访问不被允许访问的内存区域(比如,尝试写一块属于操作系统的内存),或以错误的类型访问内存区域(比如,尝试写一块只读内存)。”
一般段错误的原因有3个:- 数组或者内存越界啦,一定要注意边界啊。
- 访问类型错误,数据类型不一致。比如非要访问一块只读内存,或者输出的时候类型错误。
- 访问了不存在的内存,就是空指针啊。
标准输入流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;
}sizeof()的坑
用sizeof(array)来求一个数组的长度时,它返回的是类型的对象表示的字节数,即返回一个对象或类型所占的内存字节数,所以他与机器时32位还是64位有关。
所以一个数组的实际长度应该是:sizeof(array)/sizeof(array[0])