知识点:(Primer Plus)
- cin>>:cin为istream类对象,>>运算符函数原型为istream & operator>>(int &),参数和返回值都是引用,因此cin能够直接修改实参的值
- istream类还未字符指针类型重载了>>抽取运算符,所以char[20]; cin>>name;
- cin>>跳过空白(空格、换行符和制表符),直到遇到非空白字符
- 流状态:eofbit:到达文件尾置1;badbit:文件被破坏置1;failbit:未读取到预期字符或者输入操作没有写入预期字符置1。
- 设置状态:clear()形参为三种状态,默认参数为0,也就是三个状态位全部清零,若clear(eofbit),则eofbit将置1,其他清零;setstate()只影响其参数中已设置的位,如setstate(eofbit)则只置位eofbit,其他不受影响。
- exceptions()返回一个位掩码,指出哪些标记导致异常被引发。std::exception类派生出一个ios_base::failure异常类,包含一个what()方法。
- clear()重置流状态后,导致输入异常的不匹配输入仍在输入队列中,一种方法是一直读取字符,知道到达空白,用isspace()检查,在空白字符时返回true;另一种是丢弃行中的剩余部分,判断cin.get() != '\n'。
- 清除流中数据,sync()清除缓存区内容,ignore(num, '\n')清除指定字符。
- 单字符输入,get(&char)和get(void)提供不跳过空白的单字符输入功能,前者返回cin对象,后者返回字符编码(int值)。
- 单字符输入时,如果希望跳过空白(包括'\n'),则使用cin>>(cin碰到空白符自动跳过,但并不表示输入流中的空白符消失了,只是被cin忽略了,如果使用完cin后使用不跳过空白符的get()函数,则空白符会被读取,见下面问题1);如果希望读取每个字符,使用get(&char)更佳。
- 字符串输入,默认读取整行,get(char*, int, char);getline(char*, int, char)。第二个参数要比读取的最大字符大1,因为包含储存结尾的空字符,前者会将换行符留在流中,需小心,后者会舍弃换行符。
问题:
1、cin>>和getline()混用需小心
cin>>a;
//cin.clear();
//cin.sync();
//cin.ignore(1);
cin.getline(b,10);
以上程序在输完a后,会自动跳过getline函数
原因:cin输入完后会将换行符\n留在输入流中,所以getline读到的是\n,用sync()清除缓存区内容,或ignore()清除指定字符,解决该问题