`
gstarwd
  • 浏览: 1525088 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

cin, cin.get(),cin.getline()

阅读更多

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
using namespace std;
int main()
{
       char c1, c2;
       cin.get(c1);
       cin.get(c2);
       cout<<<" SPAN < ?<<测试一输入:
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
using namespace std;
int main ()
{
char a[20];
cin.get(a, 10);
cout<<
return 0;
}
测试一输入:
abc def[Enter]
输出:
abc def
【分析】说明该函数输入字符串时可以接受空格。
测试二输入:
1234567890[Enter]
输出:
123456789
【分析】输入超长,则按需要的长度取数据。
程序7
#include
using namespace std;
int main ()
{
char ch, a[20];
cin.get(a, 5);
cin>>ch;
cout<<
cout<<(int)ch<< FONT>
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
using namespace std;
int main ()
{
char ch, a[20];
cin.getline(a, 5);
cin>>ch;
cout<<
cout<<(int)ch<< FONT>
return 0;
}
测试输入:
12345[Enter]
输出:
1234
-52
【分析】与cin.get(array_name, Arsize)的例程比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了-52,这里其实cin>>ch语句没有执行,是因为cin出错了!
 

<

C/C++学习笔记1 - 深入了解scanf()/getchar()和gets()等函数

http://blog.csdn.net/lewsn2008
----------------------------------------------------
| 问题描述一:(分析scanf()和getchar()读取字符)   |
----------------------------------------------------
    scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序:
程序1:
    #include
    int main()
    {
char ch1, ch2;
scanf("%c", &ch1);
scanf("%c", &ch2);
printf("%d %d ", ch1, ch2);
return 0;
    }
    或者是:
    #include
    int main()
    {
char ch1, ch2;
ch1 = getchar();
ch2 = getchar();
printf("%d %d ", ch1, ch2);
return 0;
    }
    程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。可是执行程序后会发现除了问题:当从键盘输入一个字符后,就打印出了 结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符'a', 打印结果是97,10。这是为什么呢?
【分析】:
    首先我们呢看一下输入操作的原理, 程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中 取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子 中为什么会出现输入语句失效的原因!
    其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读 取时遇到回车( )而结束的,这个会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符,这样第二次的读入函数直接从缓冲区中把取走了,显然读取成功了, 所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!

----------------------------------------------------
| 问题描述二:(分析scanf()和gets()读取字符串)   |
----------------------------------------------------

首先我们看一下scanf()读取字符串的问题:
程序2:
    #include
    int main()
    {
char str1[20], str2[20];
scanf("%s",str1);
printf("%s ",str1);   
scanf("%s",str2);
printf("%s ",str2);
return 0;
    }
    程序的功能是读入一个字符串输出,在读入一个字符串输出。可我们会发现输入的字符串中不能出现空格,例如:
测试一输入:
Hello world!
输出:
Hello
world!
【分 析】到此程序执行完毕,不会执行第二次的读取操作!这个问题的原因跟问题一类似,第一次输入Hello world!后,字符串Hello world!都会被读到输入缓冲区中,而scanf()函数取数据是遇到回车、空格、TAB就会停止,也就是第一个scanf()会取出"Hello", 而"world!"还在缓冲区中,这样第二个scanf会直接取出这些数据,而不会等待从终端输入。

测试二:
Hello[Enter]
Hello[输出]
world[Enter]
world[输出]
【分析】程序执行了两次从键盘读入字符串,说明第一次输入结束时的回车符被丢弃!即:scanf()读取字符串会舍弃最后的回车符!


我们再看一下gets()读取字符串的情况:
用scanf来读取一个字符串时,字符串中是不可以出现空格的,一旦出现空格,后面的数据就会舍弃残留在缓冲区中。其实有另外一个函数是可以接受空格的,那就是gets(),下面我们看一下这个函数的应用,我们把程序2改动一下:
程序3:
#include
int main()
{
char str1[20], str2[20];
gets(str1);
printf("%s ",str1);   
gets(str2);
printf("%s ",str2);
return 0;
}
测试:
Hello world! [输入]
Hello world! [输出]
12345 [输入]
12345 [输出]
【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个字符串取了Hello world! 接受了空格符,而没有像上一个程序那样分成了两个字符串!所以如果要读入一个带空格符的字符串时因该用gets(), 而不宜用scanf()!


--------------------------------------------------------
| 问题描述三:(getchar()暂停程序,查看程序执行结果)|
--------------------------------------------------------
    不知道大家有没有遇到过这样的问题,有的编译器程序执行完后的结果界面不会停下而是一闪就没了,以至于看不到执行结果。所以很多人在程序最后加上 getchar()语句,目的是想让程序执行完后停下来,等待从终端接收一个字符再结束程序。可是发现有时候这样根本没用,程序照样跳出去了。这是为什么 呢?
【分析】原因跟上面例子讲的一样,是因为输入缓冲区中还有数据,所以getchar()会成果读到数据,所以就跳出了!

------------------
|     【总结】    |
------------------

第一: 要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!

第二: 为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
       这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
       scanf("%[^ ]",string);

分享到:
评论

相关推荐

    cin,cin.get,cin.getline等函数深入分析.doc

    cin,cin.get,cin.getline等函数深入分析.doc

    基于C++ cin、cin.get()、cin.getline()、getline()、gets()函数的使用详解

    今天,我们将详细介绍 cin、cin.get()、cin.getline()、getline() 和 gets() 函数的使用。 1. cin 函数 cin 是 C++ 中最基本的输入函数,它可以用来输入各种类型的数据,包括整数、浮点数、字符、字符串等。使用 ...

    cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

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

    cin,cin.get,cin.getline等函数深入分析[参照].pdf

    cin.get() 函数有三种格式:无参,一参数,二参数即 cin.get(), cin.get(char ch), cin.get(array_name, Arsize)。读取字符的情况:输入结束条件:Enter 键对结束符处理:不丢弃缓冲区中的Enter cin.get() 与 cin...

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

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

    cin用法集锦(getline,cin.get().....)

    C++语言中提供了多种输入函数,例如cin、cin.get()、cin.getline()、getline()、gets()、getchar()等,每种函数都有其特点和用法,下面对这些函数进行详细的介绍。 1. cin&gt;&gt; cin&gt;&gt;是C++中最基本的输入函数,用法1...

    笔记:cin,cin,get,cin.getline等输入函数的用法

    本文将详细介绍几种常见的C++输入函数,包括cin、cin.get()、cin.getline()、getline()以及gets(),并给出相应的使用示例。 1. `cin`:这是C++中最基本的输入函数,通常用于读取整数、浮点数或单个字符。例如: ``...

    cin.get()和cin.getline()之间的区别

    在C++编程中,`cin.get()` 和 `cin.getline()` 都是用来从标准输入流中读取数据的函数,但它们在处理输入时的行为有所不同,尤其涉及到如何处理换行符。下面将详细阐述这两个函数的主要区别以及使用时需要注意的事项...

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

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

    c++,cin.clear用法

    在 C++ 中,cin 对象可以使用多种方式来读取数据,包括使用 cin.get()、cin.getline() 和 cin.sync() 等方法。今天,我们将详细介绍 cin.get() 和 cin.clear() 的用法。 首先,让我们来看一下 cin.get() 的用法。...

    C++ 中cin 输入流的多种函数用法.doc

    C++ 提供了多种函数用法来满足不同的输入需求,本文将对cin、cin.get()、cin.getline()、getline()、gets() 函数的用法进行详细介绍。 1. cin&gt;&gt; 函数用法 cin&gt;&gt; 函数是C++ 中最基本和最常用的输入函数,可以输入...

    C++ cin.getline及getline()用法详解

    在C++编程语言中,`cin.getline()`和`getline()`是两个用于从标准输入流中读取用户输入的字符串的函数,虽然它们都用于读取整行数据,但它们之间存在一些关键的区别。 首先,`cin.getline()`是C++标准库中`istream`...

    c++ getline

    我们已经详细介绍了 C++ 中的输入函数,包括 cin&gt;&gt; 函数、cin.get() 函数、cin.getline() 函数、getline() 函数、gets() 函数、getchar() 函数和 cin.ignore() 函数。这些函数都是 C++ 中非常重要的输入函数,掌握...

    C++输入cin详解

    总结,C++中`cin`的输入方法包括`cin &gt;&gt;`、`cin.get()`和`cin.getline()`,每种都有其特定的应用场景。理解它们的工作原理和结束符处理规则对于编写正确处理用户输入的C++程序至关重要。在实际编程中,开发者应根据...

    详解C++ cin.getline函数

    总结来说,`cin.getline`是C++中用来读取用户输入字符串,特别是包含空格和特殊字符的字符串的重要函数。它避免了`cin`与`&gt;&gt;`运算符可能出现的问题,使得输入处理更加灵活和准确。在编写需要完整读取一行数据的程序...

    cin函数[文].pdf

    本文档详细介绍了与`cin`相关的几个函数,包括`get()`、`getline()`、`ignore()`、`peek()`和`putback()`,这些都是在处理输入流时非常重要的操作。 1. `cin.get()`函数: - `cin.get(ch)`:从输入流中读取一个...

Global site tag (gtag.js) - Google Analytics