cin>>, cin.get,cin.getline等函数深入分析
问题描述
很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(), cin.ignore(), cin.fail(), cin.good()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因!而且很多人也确确实实遇到过不少问题,以下是几个简单的例子:
程序1:
#include <iostream>
using namespace std;
int main()
{
int m, n;
cin>>m;
cin>>n;
return 0;
}
测试情况:
如果用户每次都输入两个合法的数,程序不会出问题!
但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符'a',你会发现程序不
会再执行第二条输入语句。似乎有点奇怪!!
程序2:
#include <iostream>
using namespace std;
int main()
{
char str[8];
cin.getline(str, 5);
cout<<str<<endl;
cin.getline(str, 5);
cout<<str<<endl;
return 0;
}
程序的功能很简单,就是输入一个字符串再输出,再次输入一个字符串输出。程序执行情况:
测试一:
abcd (回车)
abcd (输出)
efgh (回车)
efgh (输出)
当用户第一次输入的字符串字符数小于4时,程序执行正常!
测试二:
abcdefgh (回车)
abcd (输出)
(输出-换行)
当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!
其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!
输入操作的原理
与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!
cin的一些输入函数和操作符
cin is a extern istream object。提供了很多可用的成员函数和重载的操作符,如:cin>>, cin.get(), cin.getline()等。下面我们来了解一下这几个函数:
一. cin>>
该操作符是根据后面变量的类型读取数据。
输入结束条件 :遇到Enter、Space、Tab键。(这个很重要!)
对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)
读字符的情况:
程序3:
#include <iostream>
using namespace std;
int main()
{
char c1, c2;
cin>>c1;
cin>>c2;
cout<<c1<<" "<<c2<<endl;
return 0;
}
测试一输入:
a[Enter]
b[Enter]
输出:
a b
测试二输入:
a b[Enter]
输出:
a b
读字符串的情况:
程序4:
#include <iostream>
using namespace std;
int main()
{
char str1[10], str2[10];
cin>>str1;
cin>>str2;
cout<<str1<<endl;
cout<<str2<<endl;
return 0;
}
测试一输入:
abcd[Enter]
efgh[Enter]
输出:
abcd
efgh
【分析】输入遇到回车符结束,很正常。
测试二输入:
abcd efgh
输出:
abcd
efgh
【分析】第一次读取字符串时遇到空格则停止了,将abcd读入str1,并舍弃了空格,将后面的字符串给了第二个字符串。这证明了cin读入数据遇到空格结束;并且丢弃空格符;缓冲区有残留数据室,读入操作直接从缓冲区中取数据。
二.cin.get()
该函数有三种格式:无参,一参数,二参数
即cin.get(), cin.get(char ch), cin.get(array_name, Arsize)
读取字符的情况:
输入结束条件:Enter键
对结束符处理:不丢弃缓冲区中的Enter
cin.get() 与 cin.get(char ch)用于读取字符,他们的使用是相似的,
即:ch=cin.get() 与 cin.get(ch)是等价的。
程序5:
#include <iostream>
using namespace std;
int main()
{
char c1, c2;
cin.get(c1);
cin.get(c2);
cout<<c1<<" "<<c2<<endl; // 打印两个字符
cout<<(int)c1<<" "<<(int)c2<<endl; // 打印这两个字符的ASCII值
return 0;
}
测试一输入:
a[Enter]
输出:
a
97 10
【分析】会发现只执行了一次从键盘输入,显然第一个字符变量取的'a', 第二个变量取的是Enter(ASCII值为10),这是因为该函数不丢弃上次输入结束时的Enter字符,所以第一次输入结束时缓冲区中残留的是上次输入结束时的Enter字符!
测试二输入:
a b[Enter]
输出:
a
97 32
【分析】显然第一个字符变量取的'a', 第二个变量取的是Space(ASCII值为32)。原因同上,没有丢弃Space字符。
读取字符串的情况:
cin.get(array_name, Arsize)是用来读取字符串的,可以接受空格字符,遇到Enter结束输入,按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。
程序6:
#include <iostream>
using namespace std;
int main ()
{
char a[20];
cin.get(a, 10);
cout<<a<<endl;
return 0;
}
测试一输入:
abc def[Enter]
输出:
abc def
【分析】说明该函数输入字符串时可以接受空格。
测试二输入:
1234567890[Enter]
输出:
123456789
【分析】输入超长,则按需要的长度取数据。
程序7:
#include <iostream>
using namespace std;
int main ()
{
char ch, a[20];
cin.get(a, 5);
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return 0;
}
测试一输入:
12345[Enter]
输出:
1234
53
【分析】第一次输入超长,字符串按长度取了"1234",而'5'仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接取了'5',所以打印的ASCII值是53('5'的ASCII值)。
测试二输入:
1234[Enter]
a[Enter]
输出:
1234
97
【分析】第二次输入有效,说明该函数把第一次输入后的Enter丢弃了!
三.cin.getline()
cin.getline() 与 cin.get(array_name, Arsize)的读取方式差不多,以Enter结束,可以接受空格字符。按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。
但是这两个函数是有区别的:
cin.get(array_name, Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。(具体原因将在下一部分"cin的错误处理"中详细介绍)
程序8:
#include <iostream>
using namespace std;
int main ()
{
char ch, a[20];
cin.getline(a, 5);
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return 0;
}
测试输入:
12345[Enter]
输出:
1234
-52
【分析】与cin.get(array_name, Arsize)的例程比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了-52,这里其实cin>>ch语句没有执行,是因为cin出错了!下一部分将详细介绍。
cin>>输入操作符返回流对象的引用,cin >> x 返回istream&,cout << x返回ostream&
if可直接判断流,如if (cin)
while间接判断,如while (cin >> x)
若流被标记错误(读取失败)就返回false.
ctrl+z,F6可跳出循环,这代表eof(文件结束符)
分享到:
相关推荐
### cin.clear()、cin.sync() 和 cin.ignore() 的用法详解 #### 一、cin.clear() `cin.clear()` 是一个非常实用的函数,用于重置输入流的状态标志。当输入流发生错误时(例如尝试将非数字赋值给整型变量),`cin` ...
xp系统中利用dev-cpp进行编程,语句while(cin>>str),str是个string类型,在一行中输入几个string,末位加个ctrl+z,输入没有结束,除非出入换行后,再输入ctrl+z才能跳出输入。一直不明白未什么,解释请看下。 输入...
在做acm一些题时,经常出现 数据集超大造成 cin读入过多 超时的情况。 这是因为在c++中cin,cout虽然方便但是效率低。 是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的...
"C++ 中的 cin.clear() 用法详解" C++ 中的输入输出机制是通过 iostream 类库来实现的,其中包括 istream 和 ostream 两大类。istream 负责输入操作,而 ostream 负责输出操作。在 iostream 中,有两个重要的对象:...
在C++编程语言中,`cin`和`cout`是两个非常基础且重要的概念,它们分别用于标准输入(从键盘或其他输入设备获取数据)和标准输出(向屏幕或其他输出设备显示数据)。`cin`和`cout`是C++标准库中的流对象,属于`...
cin 和 scanf 输入错误的处理 在 C++ 编程中,输入函数 cin 和 scanf 是非常常用的标准输入函数,但是在调用这两个函数时,也常常会遇到一些问题,例如对整型数组输入字符后就会发生无法用输入推出循环的情况,这...
C++中的输入流对象cin是一个非常重要的工具,它允许程序从标准输入设备(通常是键盘)读取数据。cin的用途包括但不限于从键盘输入文本或数字,而且它还可以用来读取来自标准输入流的数据。cin不是函数,而是一个预定...
### cin与cout的用法详解 #### 一、标准输入函数cin `cin`作为C++中的标准输入流,主要用于从标准输入设备(通常是键盘)读取数据。它的工作原理基于流的操作,与传统的C语言中的`scanf`有所不同。下面我们将详细...
本文将详细介绍几个常见的输入函数:cin、cin.get()、cin.getline()、getline()以及gets(),并探讨它们的用法。 1. `cin` `cin`是C++标准库中的一个对象,用于从标准输入流(通常是键盘)读取数据。它使用操作符`>...
### cin.get()等函数的详细用法总结 #### 一、cin `cin`是C++标准库中的一个对象,它代表了标准输入流。在程序中,我们通常使用`cin`来读取用户从键盘输入的数据。 ##### 用法1:基本用法 最常用的方式就是使用`...
Cin.getline 终极用法详解 Cin.getline 是 C++ 编程语言中的一种输入函数,用于从标准输入流中读取字符串。今天,我们将探索 Cin.getline 的终极用法,了解其使用方法和实践应用。 Cin.getline 基本用法 Cin....
cin.get()、cin.getline()、getline()、gets()和getchar()是用于从标准输入流(通常是键盘)读取数据的函数,它们各有优缺点。 1. cin.get()函数: cin.get()通常用于读取单个字符或字符数组。当读取字符数组时,它...
在C++编程中,`cin`和`scanf`是两种主要的输入函数,它们用于从标准输入(通常是键盘)读取数据。理解它们的用法和特性对于编写有效的程序至关重要。下面将详细介绍`cin`和`scanf`的区别、使用场景以及需要注意的...
在C++编程中,`cin`是输入流对象,用于从标准输入设备(通常是键盘)读取数据。本文将深入探讨`cin`处理字符串的一些小技巧及其在实际编程中的应用。 `cin`是C++标准库`<iostream>`中的一个成员,属于`std`命名空间...
CIN-CC-ACD WEB管理系统使用手册 一、前言 欣方通信技术有限公司为满足现代企业呼叫中心需求,研发了CIN-CC-ACD WEB管理系统,旨在提供一个全面的通信平台,整合多种通信方式并服务于不同的网络环境。此手册旨在...
labview创建CIN节点C文件的具体详细步骤 具体到每一个细节 适合新手
CIN_Configuration_Document SAP 差异处理