关于cin输入的问题

转载 2015年11月18日 19:49:43
 <span style="font-family:SimSun;font-size:18px;"> </span>

原理:   程序的输入都会提前建立一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中

取得数据。正因为cin函数是直接从缓冲区去数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入(容易忽略的点)

 #include <iostream>
using namespace std;
int main()
{    
     char s[6];  
    cin.getlint(s,4); 
    cout<<s<<endl; 
    cin.getlint(s,4);    
    cout<<s<<endl:      
    return 0;
}
输入:abcdef(enter)
输出:abc
 
【分析】之所以第一次输入完后直接程序就结束了,而不是进行第二次输入,是因为第一次多输入的数据还残留在缓冲区中,第二次输入就直接从缓冲区中提取而不会在请求键盘输入,一下探究几种常见的输入方式:
 
一,cin>>
该操作符是根据后面变量的类型读取数据。
输入结束条件:遇到Enter,Space,Tab键。
对结束符的处理:丢弃缓冲区中使得输入结束的结束符(Enter,Space,Tab)
eg2:
#include <iostream>
using namespace std;
int main()
{
	char s1[10],s2[10];
	cin>>s1;
	cin>>s2;
	cout<<s1<<endl;
	cout<<s2<<endl;
	return 0;
}
 
输入:abcd efgh
输出:abcd
     efgh
【分析】第一次读取字符串时遇到空格则停止了,将abcd读入s1,并舍弃了空格,将后面的字符串给了第二个字符串,这证明了cin读入数据遇到空格结束,并且丢弃空格符;缓冲区有残留数据,读入操作直接从缓冲区中去数据。
 
二,cin.get(数组名,长度,结束符)
其中结束符为可选参数,读入的字符个数最多为(长度-1)个,结束符规定结束字符串读取的字符,默认为enter,若要读取字符,直接cin.get(char ch)或ch=cin.get()
读取字符的情况:
输入结束条件:enter键
对结束符处理:不丢弃缓冲区中的enter
cin.get()与cin.get(char ch)用于读取字符,他们的使用是相识的,
即:ch=cin.get()与cin.get(ch)是等价的。
 
eg3:
#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,这是一位改函数不丢弃上次输入结束时的Enter字符,所以第一次输入结束时缓冲区中残留的是上次输入结束是的Enter字符!
 
输入:a b[enter]
输出:a
  97  32
【分析】显然第一个字符变量取的‘a’,第二个变量取的是Space,原因同上,没有丢弃space字符,
读取字符串的情况:
输入结束条件:默认enter键(因此可接受空格,Tab键),可在第三个参数上定义结束符
对结束符处理:丢弃缓冲区的enter
 
eg4:
#include<iostream>
using namespace std;
int main()
{
	char ch,a[20];
	cin.get(a,5,'d');
	cin>>ch;
	cout<<a<<endl;
	cout<<(int)ch<<endl;
	return 0;
}
 
输入:12345[enter]
输出:1234
    53
【分析】第一次输入超长,字符串按长度取了“1234”,而‘5’仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接去了‘5’,所以打印的是53
 
输入:12d45[enter]
输出:12
  d
【分析】第二次输出为d,说明自定义结束符时不丢弃缓冲区中的结束符
 
三,cin.getline()
 
cin.getline(数组名,长度,结束符)大体与cin.get(数组名,长度,结束符)类似
 
区别在于:
cin.get()当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作符会继续执行,只是直接从缓冲区中取数据,但是cin.getline()当输入超长是开会引起cin函数的错误,后面的cin操作将不再执行。
 
eg5:
#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()的列子比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了-52,这里其实cin>>ch语句没有执行,是因为cin出错了!
 
 
    
举报

相关文章推荐

关于cin输入的问题

原理:   程序的输入都会提前建立一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中 取得数据。正因为cin函数是直接从缓冲区去数...

cin标准输入流的错误处理

首先这个知识我是在《C++ primer plus》第六版这本书上了解到的,在第六章的187页开始,对于cin标准输入流检测到用户输入了错误内容时,一般情况下应采取以下三个步骤一一进行: 1.重置ci...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

文章标题

屏幕的适配适配的目的 就是为了app在不同的语言、不同的屏幕、不同的平台中都能够平稳运行适配从三方面考虑1.语言适配 国际化 i18N 当app发布到设备时 动态的修改设备的语言 app...

计算1的个数

引用博客1.0 问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 例如:N=2,1,2出现了1个“1”。 N=12,1,2,3,4,5,6,7,8,9,10...

关于Scanner输入问题

最近碰到一个问题,就是需要提供输入给程序,得到

关于cin>>x的返回值问题

转载自:http://www.cnblogs.com/gysm/archive/2011/08/03/2126511.html 最近在看C++,学到了标准库这一章,看到cin的时候,我们经常...

关于各种输入输出问题

关于ACM的输入输出(一) 写给第一次参加现场赛的同学们 一般来说ACM的现场赛会规定输入输出 或者是文件输入标准输出 也可能是文件输入文件输出 如果没有规定的话那么一般...

关于限制TextView的输入问题

三种关于限制输入的方式: 一种是KeyListener-----参见DialerKeyListener.   这个是在有Key输入的时候触发。 一种是InputFilter...

对于cin提取输入流遇到空格的问题

引子老谭CPP教材:           “流提取符 >> 从流中提取数据时通常跳过流中的空格 tab键换行符等空白字符。”(P430页倒数第10行...

用cin输入

用cin输入cin从输入流中抽取字符,需要转换为相应的类型可以将hex,oct,dec与cin一起使用cin>>如何检查输入cin>>抽取字符时,会跳过空白字符(空格,制表符,换行符) 也就是说,'...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)