关于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出错了!
 
 
    

C++ Cin输入数字时 输入字母 Cin状态出错

c++ cin状态出错 恢复
  • zyb238909
  • zyb238909
  • 2016年11月06日 21:58
  • 1072

小技巧:cin输入字符串的总结

cin输入字符串的总结: 遇空字符(包括空格、回车、TAB)表示一个输入的结束,连续的空字符会被忽略。   1、测试空格作为结束   程序代码如下:   #include "iostre...
  • zhulf0804
  • zhulf0804
  • 2016年07月24日 20:50
  • 6081

输入循环在什么情况下结束,while(cin>>word) 类型?

最近学习了C++遇到的一个问题,Windows系统下不知道怎么结束~ C++Primer 中,作者经常使用 while(cin>>word) 类似的语法,但是如何结束,可能会出现疑惑 好...
  • misayaaaaa
  • misayaaaaa
  • 2016年11月25日 11:07
  • 1108

c++ cin输入格式

cin+hex:C++的输入格式 希望从键盘把一个16进制数据串输入到一个unsigned char型数组中,可怎么也搞不定。千寻万找,才明白,进制控制只适用于整型变量,不适用于实型和字符型变量,这...
  • zhb_51666
  • zhb_51666
  • 2014年03月10日 21:59
  • 925

在while中使用cin>>a 为条件,注意事项

#include using namespace std; int main() { int currVal = 0 , val = 0; if(cin >> currVal) { int ...
  • qiqi123i
  • qiqi123i
  • 2016年08月11日 19:17
  • 2408

C++ 的cin输入注意【转】----cin的状态

C++ 的cin输入注意【转】 我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,不能继续输入或操作。 你可以在程序中添加如下程序,来清空cin的输入缓冲区重新输入 ...
  • smallgyy
  • smallgyy
  • 2013年06月20日 09:56
  • 1797

C++ 控制台cin无法输入

先看今天的代码,我要先从控制台输入一个整数n,再输入n个字符串。 [cpp] view plaincopyprint? // NO2.cpp //...
  • ZK_J1994
  • ZK_J1994
  • 2017年05月22日 01:03
  • 615

标准输入cin的返回值以及读入未知数目数据的问题

在学习《C++Primer 4th》1.4.4节“读入未知数目的输入”这一部分的时候,遇到了while(std::cin>>value)这个语句,下面谈一下自己对这个语句执行情况的理解,欢迎批评指正。...
  • zhao708981169
  • zhao708981169
  • 2013年12月14日 21:59
  • 1206

C++中使用cin输入时的出错处理

使用cin作为程序的输入时,很容易因为类型不匹配等原因导致输入失败,所以,在编写C++程序时一定要对此处特别留心。如何正确处理cin的状态标识符以及适当清空输入缓存区的内容,是一个很重要的知识点...
  • playboy_lei
  • playboy_lei
  • 2016年01月20日 17:24
  • 2775

Cin的用法详解以及文件的读取

今天主要学习Pointer和Array的相关内容,这些问题对我来说都是老生常谈了,较为感兴趣的是那个例子。 #include #include using namespace std...
  • alpha_love
  • alpha_love
  • 2017年07月05日 11:15
  • 455
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于cin输入的问题
举报原因:
原因补充:

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