IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> ?关于C++之cin>>、cin.getline、cin.get提取字符串差异 -> 正文阅读

[C++知识库]?关于C++之cin>>、cin.getline、cin.get提取字符串差异

cin>>

cin是使用空白(空格、制表符和换行符)来确定字符串的结束位置,并清除遇到的空白缓冲;而字符串的开始位置是通过清除开头(若有)的空白缓冲来确定的。
假设在键盘键入:\t\t\tAlistair \tDreeb<Enter>
则输入缓冲区有:\t\t\tAlistair \tDreeb\n(关于缓冲输入,见Blog:关于C之缓冲输入

1. cin >> chArr0;// 键盘输入:\t\t\tAlistair \tDreeb<回车>。这时chArr0=Alistair
2. cin >> chArr1;// chArr1=Dreeb(直接从缓冲区取,不等待键盘输入)
3. cin >> chArr2;// 等待键盘输入

在缓冲区中有\t\t\tAlistair Dreeb\n,第1行cin在提取字符时,首先清除连续的空白缓冲(三个制表符)到了开始位置’A’,接着是"listair",直到遇到了空格符,清除这个空格符缓冲并结束提取,所以chArr0=Alistair;第2行cin接着从剩余的缓冲区提取字符,开始清除制表符,然后从’D’开始,接着是"reeb",直到遇到了换行符,清除这个换行符缓冲并结束提取,所以chArr1=Dreeb。至此,缓冲区被完全清空了,第3行cin就无法从缓冲区提取到任何字符了,所以只能等待键盘输入了。

cin.getline()与cin.get()

相同点:cin.getline()cin.get()都是以换行符来确定字符串的结束位置的。并且这两个函数都读取一行输入。
不同点:cin.getline()丢弃换行符(也把换行符从缓冲区中清除了)。cin.get()不丢弃换行符,保留在输入队列中(即,不清除换行符缓冲)。

1. cin.getline(nameArr, ArrSize);// 键盘输入:Dirk Hammernose
2. cin.getline(dessertArr, ArrSize);// 【等待】键盘输入:Radish Torte
3. cout << nameArr << " like " << dessertArr;// 打印:Dirk Hammernose like Radish Torte

第2行,等待键盘输入,由此也佐证了,cin.getline()丢弃\n并从缓冲区清除了它。

1. cin.get(nameArr, ArrSize);// 键盘输入:Dirk Hammernose
2. cin.get(dessertArr, ArrSize);// dessertArr=\n(直接从缓冲区取,不等待键盘输入)

第2行,直接从缓冲区提取到换行符,由此也佐证了,cin.get()没有清除换行符缓冲,而是将换行符保留在了输入队列中。
要修正程序的话,就这样:

cin.get(nameArr, ArrSize);
cin.get();// 读取\n
cin.get(dessertArr, ArrSize);
输入的字符串比分配的空间长

如果输入行包含的字符数比指定的多,则cin.getline()和cin.get()将把余下的字符留在输入队列中,即下次会直接先从余下的字符缓冲中提取。不过cin.getline()还会设置失效位,并关闭后面的输入。

读取到空行

比如某些操作系统中换行是:\r\n,它或者它们占一行,从文本读取到就是空行。
当前C++的做法是:当cin.get()而不是cin.getline()读取空行后将设置失效位(failbit)。这意味着接下来的输入将被阻断,但可以用这条命令来恢复输入:cin.clear();
其实有很多判空的方法,比如:

string name;
ifstream in("C:/Users/Administrator/Desktop/save_paper.txt");
while (!in.eof()){
	getline(in, name);
	if (name.empty()) {
		continue;
	}
	......
}

或:
先getline(字符串)再strlen(字符串)==0就是空行
。。。。。。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:10:05  更:2022-02-28 15:10:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:08:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码