c++ 总结之 cin输入
目录
cin最简单的使用
cin检查输入
流状态
istream类方法
输入单字符
输入字符串
对流状态的影响
其他istream类方法
cin最简单的使用
使用cin从输入流(一般是键盘生成的)中读取数据,cin >> type,其中 type 可以是任何基本数据类型。另外 cin 还重载了对 char* ,signed char* ,unsigned char* 的 >> 运算符,使得 cin 可以读取一串字符,并在结尾加一个空值字符,形成一个字符串。
当配合 hex,oct,dec 控制符时,可以指定输入的格式是16进制,8进制还是10进制。
cin检查输入
cin 在查看输入流的时候,会自动跳过空白(空格,换行符,制表符)直到遇到非空白字符。对于单字符模式也是如此,这样才能使得如下代码按照我们的预期进行:
int main(){char c1, c2, c3;cin >> c1 >> c2 >> c3;cout << c1 << c2 << c3;
}
接收了用空格隔开的三个字符,最后成功读取到我们想要它接收的正确字符,而没有读取空格。
cin 也会聪明的根据类型选着读取,例如我要接受一个整形给 int 变量赋值,而我输入了一个 123*,显然 * 不是一个数字,那么 cin 就会只读 123,而把 * 留在输入流中等待接下来的 cin 有可能会接收它。
如果我们的输入无法满足 cin 的要求,那么 cin 就不会读入数据,并返回一个 0。例如:
int main(){int a = 1;cin >> a;cout << a << endl;cin.clear(); //此句作用详见流状态cin >> a;cout << a << endl;
}
第一个 cin 我们输入一个 * 号,不是 cin 所期望的整形,那么它将不改变这里 a 的值(这里我尝试的如上图,确实 a 的值不一样了,但cpp说是不改变,这里先放一下),同时返回 0。这里虽然 cin 了两次,但只接受了一个 * 号,为什么两个 cin 都结束了? 因为 * 号在输入流中并没有移除,第二个 cin 接受的还是没有地方安放的那个 * 号,同样因为类型不匹配而返回 0。(到最后 * 号还是无家可归 qaq )
int main(){int a;cin >> a;cout << a << endl;cin.clear();char c;cin >> c;cin >> a;cout << a << endl;
}
而写成这样子,用 char 型变量 c 把 *号接收了,第二个 cin >> a 就可以正常接收整形了!(可怜的 * 号终于有了一个家)
流状态
流状态是顾名思义就是输入或输出流的状态,cin 和 cout 对象都包含了一个描述流状态的变量(iostate 类型),它由三个元素组成:eofbit,failbit,badbit,其中每一个元素都由一位来表示(1代表是,0代表否)。
成员 | 描述 |
eofbit |
到达文件尾则此位设置为1 |
badbit | 如果流被破坏则此位设置为1 |
failbit | 如果输入未能读取预期的字符或输出操作没有写入预期字符,则此位设置为1 |
goodbit | 流状态正常,也代表所有位为 0 即表示 0 |
good() |
如果流正常则返回 true |
eof() | 如果 eofbit 为 1 返回 true |
bad() | 如果 badbit 为 1 返回 true |
fail() | 如果 badbit 或 failbit 为 1 返回 true |
rdstate() | 返回流状态 |
exceptions() | 返回一个位掩码,指出哪些标记将导致异常发生 |
exceptions(iostate ex) | 设置哪些状态将导致 clear() 引发异常 |
clear(iostate s) | 将流状态设置为 s,s 默认为 0 即goodbit |
setstate(iostate s) | 设置与 s 中对应位的流状态,其他位保持不变,相当于用 s 与 当前流状态做 "或运算" |
这时,我们再去看上面的那个例子,当我要接收一个int型数字却输入一个char类型的字符,那么此时 cin 没有接收到预期的输入,所以 cin 的流状态将被设置为 failbit ,导致 cin 无法继续接收输入,因此我需要调用 cin.clear() 将流状态置为 goodbit ,cin才能继续接收输入。
istream类方法
输入单字符
使用 get() 方法将读取下一个字符,包括空格、制表符、换行符。
1.使用 get(char &) 成员函数,其返回一个 调用它的 istream 对象的引用,因此可以拼接使用,例如:cin.get( ch1 ).get( ch2 ) >> ch3 ;如果存在有效输入,cin.get(char &) 总返回 true,当到达文件尾时将返回 false。
2.使用 get(void) 成员函数,其返回一个整型,因此它不可拼接,只能在拼接的 cin 序列最后使用,例如:cin.get( ch1 ) >> ch2 .get() ; 当到达文件尾时将返回 EOF。
使用两种方法读取一串字符并按字母打印出来
char ch1;while(cin.get(ch1)) cout << ch1 << ' ';cout << endl;char ch2;while((ch2=cin.get())!=EOF) cout << ch2 << ' ';cout << endl;
方法的选择
如果希望跳过空白字符,如空格、换行、制表,就使用 >> 来接收,如果希望接收所有字符,那就使用 get() 方法(例如通过空格来判断单词长度)。而 get() 中 get(char &) 更优,get(void) 主要是因为其与c语言中的 getchar() 类似,可以直接替换。
输入字符串
使用 get() 方法
- istream& get(char* str, int num, char ch) 其中 str 为存放输入的字符串的地址(数组名),num 为将要读取的最大字符数+1(因为要有一位结束符),ch 为指定的分隔符。该函数将在读取到最大字符数或遇到分隔符时停止。
- istream& get(char* str, int num) 该函数是默认分隔符为换行符,其他同上。
使用getline() 方法
- istream& getline(char* str, int num, char ch) 其中 str 为存放输入的字符串的地址(数组名),num 为将要读取的最大字符数+1(因为要有一位结束符),ch 为指定的分隔符。该函数将在读取到最大字符数或遇到分隔符时停止。
- istream& getline(char* str, int num) 该函数是默认分隔符为换行符,其他同上。
也许你就会问:欸!博主博主,你这 get 和 getline 的使用方法明显就是复制粘贴的嘛,有啥区别嘛?
区别就是get会把分隔符留在输入队列中,而getline会把分隔符从队列中丢弃。
使用样例
此段输入10个数字,输出的第一行是因为接收到了9个字符(即输入最大字符数)停止接收并输出,第二行因为接收到换行符而结束输入并输出。
此段设置分隔符为 ‘#’ ,接收123后遇到 ‘#’ 停止接受输入并输出,但此时 ‘#’ 还在输入队列中,所以 get() 掉 ‘#’ ,然后在接收456并输出同样是因为 ‘#’ 停止,然后接收789和换行符,此时接收并没有停止,于是我又输入 000# ,接收到 ‘#’ 后,输出789换行符000。
上面两个程序都很简单了,只需要注意get不会丢弃分隔符,而getline会丢弃分隔符!!
对流状态的影响
下面的 getline() 指 getline(char*,int) 和 getline(char*,int,char)。
get(char* , int) 和 getline() 在遇到文件尾时会设置 eofbit,在流破坏时会设置 badbit,在不能接收到字符时(比如立刻到达了文件尾)会把空字符放入数组中,同时设置 failbit。
对于 get(char* ,int) 而言,当接收一个空行时也会设置 failbit,而 getline() 则不会,因为 getlne() 会接收换行符但会丢弃它并在数组中放入空字符。
如果读取了最大字符数且行中还有其他字符,那么 getline() 会设置 failbit。
输入空行,这时 failbit 被设置导致第二个 while 的 cin 没有执行。
输入 ctrl+Z 模拟文件尾,看到 failbit 和 eofbit 都被设置。对于get(char* ,int) 函数也是同样的结果。
getline 超过最大字符数,设置 failbit
其他istream类方法
ignore(int, char) 读取并丢弃接下来int个字符或直到遇到char
read(char*,int) 一般是对文件使用,可拼接
peek() 查看输入队列中的下一个字符,但不抽取下一个字符
gcount() 返回最后一个读取方法读取的字符数(包括get,getline,ignore,read,不包括 >>)
putback(char) 将一个字符插入到输入队列的第一个位置,可拼接
cin且到这里了,输入输出大概都写完了,文件操作虽然很有意思但现在实在没有动力写下去了。。。下次一定!!!
c++ 总结之 cin输入相关推荐
- 分段函数返回字符c语言,C++对cin输入字符的判断及分段函数处理方法示例
本文实例讲述了C++对cin输入字符的判断及分段函数处理方法.分享给大家供大家参考,具体如下: 这两个本来也不是什么问题,然而真正遇到还是有地方可以研究的.首先是C++对于cin输入的判断,有时候你定 ...
- cin输入字符串允许输入空白符
cin输入字符串允许输入空白符 文章目录 cin输入字符串允许输入空白符 使用noskipws 使用cin.getline() std::getline() int main() {string s1 ...
- 对C++中使用cin输入非法字符(数据格式不匹配)的说明
在C语言中,使用格式化输入函数scanf("%d",&i)(i为int)时,如果输入了字符,则会将字符转化为对应的ASCII码并赋给i. 但在C++中使用cin时输入非法字 ...
- 清除cin输入缓冲区,以及system(“pause“)、system(“cls“)用法
system("pause").system("cls") system("pause"):简单来说就是暂停的意思,等待接收信号,才会重新运 ...
- C++利用cin输入时检测回车的方法
今天做TJU的OJ ,其中一道题是先读入一个字符串,再读入一个整数,循环往复,直到字符串是空,也就是说回车键结束循环. 但是cin对空格和回车都不敏感,都不影响继续读入数据,所以需要一种新的方式检测回 ...
- cin输入问题的处理:cin.clear() 、cin.sync() 、cin.ignore()
1.cin.clear():清除cin流的错误状态,将错误标识改为默认0 2.cin.sync():清除缓冲区的数据 3.cin.ignore(): 其原型为: istream & ignor ...
- C++中cin输入类型不匹配解决方法
1 #include <iostream> 2 #include <set> 3 4 using namespace std; 5 6 int main() 7 { 8 int ...
- C++ while(cin>>a) cin输入直到回车结束
经常遇到循环输入,直到符合某种条件时结束输入. cin>>s是有返回值的,只要s满足类型条件,就会return true,一直执行下去,而cin会忽略空格或者enter,因此,enter后 ...
- c语言cin输入数组,C++基础:各种输入方法总结cin.get()、
原标题:C++基础:各种输入方法总结cin.get(). 在C++中,各种输入方法还是不少的,而且各有所异,本文做一点简要总结,主要涉及如下内容:cin.cin.get().cin.getline() ...
- 如何判断cin输入结束~
很简单耶 直接判断cin >> a就可以啦 不需要什么EOF和~取反符号哦 输入结束就自动退出循环啦 #include <iostream> using namespace s ...
最新文章
- linked-list-cycle-ii (数学证明)
- http接口测试工具——RESTClient
- POJ 2492 A Bug's Life 带权并查集
- darknet_ros消息在其它包中的订阅
- 【Linux】Linux软件安装和定时任务
- 机器视觉对印刷业的影响
- [导入]Nebula3学习笔记(3): Core Namespace
- 论文笔记_S2D.28_2014-ICRA_REMODE:概率单目实时稠密重建
- 批处理重置IE、批处理清理浏览器缓存、默认以管理员权限运行批处理
- 计算机组成原理中EMAR是什么,计算机组成原理(罗克露)第3章cpu.ppt
- matlab模拟多个平面波,Desktop matlab模拟两束平面波干涉
(1)光源非单色性的影响 联合开发网 - pudn.com...
- JAVA WEB 复习资料
- 用diiv实现多个方块居中嵌套--margin
- mysql写系统_一个用PHP和MYSQL写的定饭系统_PHP
- 一个算法工程师复现算法的踩坑总结
- RTC直播与RTMP直播
- ファイルダウンロード
- 时间复杂度空间复杂度分析
- 上海亚商投顾:沪指高开低走涨0.45% 大消费王者归来
- android模拟器 报错:X Error of failed request: BadRequest (invalid request code or no such operation)