`
kiikgu
  • 浏览: 4525 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

cin

 
阅读更多
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、cin.get()、cin.getline()、getline()、gets()等函数的用法

    本文将详细介绍几个常见的输入函数:cin、cin.get()、cin.getline()、getline()以及gets(),并探讨它们的用法。 1. `cin` `cin`是C++标准库中的一个对象,用于从标准输入流(通常是键盘)读取数据。它使用操作符`&gt;...

    浅谈c++中的while(cin)问题

    xp系统中利用dev-cpp进行编程,语句while(cin&gt;&gt;str),str是个string类型,在一行中输入几个string,末位加个ctrl+z,输入没有结束,除非出入换行后,再输入ctrl+z才能跳出输入。一直不明白未什么,解释请看下。 输入...

    cin.clear()、cin.sync()和cin.ignor()的用法

    ### cin.clear()、cin.sync() 和 cin.ignore() 的用法详解 #### 一、cin.clear() `cin.clear()` 是一个非常实用的函数,用于重置输入流的状态标志。当输入流发生错误时(例如尝试将非数字赋值给整型变量),`cin` ...

    为什么一些人写c++代码,前面会加上std::ios::sync_with_stdio(false); cin.tie(0);这两句话??

    在做acm一些题时,经常出现 数据集超大造成 cin读入过多 超时的情况。 这是因为在c++中cin,cout虽然方便但是效率低。 是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的...

    c++,cin.clear用法

    "C++ 中的 cin.clear() 用法详解" C++ 中的输入输出机制是通过 iostream 类库来实现的,其中包括 istream 和 ostream 两大类。istream 负责输入操作,而 ostream 负责输出操作。在 iostream 中,有两个重要的对象:...

    C++输入输入 cin cout

    在C++编程语言中,`cin`和`cout`是两个非常基础且重要的概念,它们分别用于标准输入(从键盘或其他输入设备获取数据)和标准输出(向屏幕或其他输出设备显示数据)。`cin`和`cout`是C++标准库中的流对象,属于`...

    c++中cin用法总结

    C++中的输入流对象cin是一个非常重要的工具,它允许程序从标准输入设备(通常是键盘)读取数据。cin的用途包括但不限于从键盘输入文本或数字,而且它还可以用来读取来自标准输入流的数据。cin不是函数,而是一个预定...

    cin与cout的用法

    ### cin与cout的用法详解 #### 一、标准输入函数cin `cin`作为C++中的标准输入流,主要用于从标准输入设备(通常是键盘)读取数据。它的工作原理基于流的操作,与传统的C语言中的`scanf`有所不同。下面我们将详细...

    cin和scanf输入错误的处理

    cin 和 scanf 输入错误的处理 在 C++ 编程中,输入函数 cin 和 scanf 是非常常用的标准输入函数,但是在调用这两个函数时,也常常会遇到一些问题,例如对整型数组输入字符后就会发生无法用输入推出循环的情况,这...

    cin.get()等函数的详细用法总结

    ### cin.get()等函数的详细用法总结 #### 一、cin `cin`是C++标准库中的一个对象,它代表了标准输入流。在程序中,我们通常使用`cin`来读取用户从键盘输入的数据。 ##### 用法1:基本用法 最常用的方式就是使用`...

    cin和scanf在使用时的注意事项

    在C++编程中,`cin`和`scanf`是两种主要的输入函数,它们用于从标准输入(通常是键盘)读取数据。理解它们的用法和特性对于编写有效的程序至关重要。下面将详细介绍`cin`和`scanf`的区别、使用场景以及需要注意的...

    Cin.getline终极用法1

    Cin.getline 终极用法详解 Cin.getline 是 C++ 编程语言中的一种输入函数,用于从标准输入流中读取字符串。今天,我们将探索 Cin.getline 的终极用法,了解其使用方法和实践应用。 Cin.getline 基本用法 Cin....

    cin.get()、cin.getline()、getline()、gets()、getchar()

    cin.get()、cin.getline()、getline()、gets()和getchar()是用于从标准输入流(通常是键盘)读取数据的函数,它们各有优缺点。 1. cin.get()函数: cin.get()通常用于读取单个字符或字符数组。当读取字符数组时,它...

    cin 的方法处理字符串小作用

    在C++编程中,`cin`是输入流对象,用于从标准输入设备(通常是键盘)读取数据。本文将深入探讨`cin`处理字符串的一些小技巧及其在实际编程中的应用。 `cin`是C++标准库`&lt;iostream&gt;`中的一个成员,属于`std`命名空间...

    labview创建CIN节点C文件的具体步骤

    labview创建CIN节点C文件的具体详细步骤 具体到每一个细节 适合新手

    CIN_Configuration_Document

    CIN_Configuration_Document SAP 差异处理

Global site tag (gtag.js) - Google Analytics