关于C++中的cin的一点理解

原创 2015年11月19日 12:48:47

作为一名初学者,常常会遇到用命令行,进行输入的情况,往往输入的是字符或者数字。一开始的时候,我们首先接触的是,

int i=0;

cin>>i;


这样的代码。其实cin>>本身也蛮好的,就是不能输入带空格的,这个运算符遇到空格会停止取值。

字符串的储存往往通过string和char数组。和这两个相关的cin函数有get()和getline()。在这两个函数面前该选择哪一个,已经有什么不同,我在网上找了一下资料,发现没有相关的整理,在此发文总结总结。

首先说当需要输入的是char数组的情况,char数组一般的用法是

char name[Len];
std::cin.getline(name,Len);
std::cin.get(name,Len);

 

然后是string的情况,string的一般用法是

string str;
getline(cin,str);
cin>>str;

 string类没有get函数的用法。而且把cin放到getline里面是string类独有的。

其实string类相当于一个const char数组,甚至可以把string的地址赋给一个const char指针。

string str;
const char* ch= str.c_str();


然后可以通过ch[i]来访问各个字符;甚至不用这么麻烦str[i]本身就是各个字符;

反过来,可以给string用char*来赋值,用snprintf

string s;
char c[50];
snprintf(ch,50,"要输入的字符有几个:%d",n);
s=ch;


最后是输入数字,输入数字还是比较简单的cin>>i就可以解决了,不过这里有点小技巧。需要判断输入的是否是数字可以这么做

int i;

while(!(std::cin>>i))
{
         std::cin.clear();
         std.cout<<"Please enter an int";
}

 

不过,这里引申出了一个问题就是,下面这样的代码

char temp[LEN]
int i;

cin>>i;
cin.getline(temp LEN);

cout<<i<<endl;
cout<<temp<<endl;

运行后发现,程序只让输入一次,但是看代码,我们想要的结果是输入两次,我输入一个数字,加了断电看看,i的值是没错,不过temp[0]就是'\0',直接是字符串的末尾了。然后我试着输入一个数字加一个字符串  10code,却发现结果意外得正确。i=10而且code存进了temp数组里,而且我试着讲两者的顺序倒了一下


<pre class="cpp" name="code">

cin.getline(temp LEN);cin>>i;

结果是正确的,出现了两次输入。所以我做了一个假设,cin.getline会清空cin的缓存区,而cin>>不会。可是这样。

int i,j;
cin>>i;
cin>>j;


就解释不通了。后来无意中的一个实验让我想清楚了,我们都知道字符串在电脑中的存储方式是,比如"i love coding"是 i love coding\0最后会加上一个\0。而cin读取时会自动把这个给过滤掉,而get和getline不行,所以先cin>>后getline会导致getline读取了一个\0,。所以上面的问题正确的解法是

char temp[LEN]
int i;

cin>>i;
cin.get();
cin.getline(temp LEN);

cout<<i<<endl;
cout<<temp<<endl;

然后结果就正确啦。

所以我们看cin的时候,要知道这个函数到底会不会自动过滤'\0',以及会将cin的缓存中的指针移动到什么位置。cin读的时候会过滤掉'/0',但只会将指针移到'/0'前。getline读的时候不会过滤掉'/0,但会将指针移到'/0后。get读的时候不会过滤掉'/0,并且将指针停在了'/0前,但如果仅仅发现一开始就是'/0',则会将指针移到'/0'后。

 

C++中 cin的深入理解

C++中的cin是一个 istream对象,从标准输入中读取数据,在iostream头文件中定义。 流对象不能拷贝或赋值。此外,读写一个IO对象都会改变其状态,因此传递和返回的引用都不能是const的...
  • wateryouyo
  • wateryouyo
  • 2017年03月08日 15:54
  • 1167

C++中cin,cout,以及返回值

转自:http://blog.csdn.net/kongbai308416350/article/details/4470914  今天在看c++primer的时候,读到其中这样一段话: When...
  • ljh0302
  • ljh0302
  • 2015年08月31日 20:58
  • 1699

C++中cin的详细用法

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标...
  • K346K346
  • K346K346
  • 2015年09月25日 17:24
  • 33117

C++中cin/cout的用法

格式: cin>>变量1>>变量2>>……>>变量n;cin:C++编程语言互换中的标准输入流,需要头文件iostream.hcin代表标准输入设备,使用提取运算符“>>”从设备键盘取得数据,送到输...
  • linjingtu
  • linjingtu
  • 2016年07月03日 11:52
  • 2315

cin>>i的返回值的问题

最近在看C++,学到了标准库这一章,看到cin的时候,我们经常看到很多的代码中会有这么一段while(cin>>x){ ......}。这里我们最关注的问题是while括号里面cin>>x他每次输入的...
  • weapon_tian_xia
  • weapon_tian_xia
  • 2011年10月22日 00:13
  • 10759

C++捕获cin输入错误类型值的问题

#include using namespace std; int main(){ int temp; char cht[10]; char ch; /* //1 while(1){ ...
  • o1101574955
  • o1101574955
  • 2016年07月15日 21:49
  • 1551

关于RNN(Seq2Seq)的一点个人理解与感悟

自己在这近三个月的深度网络学习中的一点小感悟,希望对自己的后面学习和实验能有所启发。...
  • liuyuemaicha
  • liuyuemaicha
  • 2017年02月23日 22:27
  • 1994

c++ cin 作为while条件

1.cin        cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostr...
  • u014182411
  • u014182411
  • 2017年03月14日 20:23
  • 3273

C++cin方法小结

本文对cin类中的方法进行了总结,包括几种常见的输入方式等。
  • m0_37409332
  • m0_37409332
  • 2017年02月18日 00:08
  • 730

C++中cin,cout进制,数据宽度与对齐,精度,取整

[cpp] view plain copy   cout'0') ////样例输出 a=41输出 0041   1、数的进制 [转载]未完的c++输入输出 默认进制: 默认状态下,...
  • tt_twilight
  • tt_twilight
  • 2017年04月17日 20:18
  • 317
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于C++中的cin的一点理解
举报原因:
原因补充:

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