关于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'后。

 

静态链接库LIB和动态链接库DLL的区别

http://blog.csdn.net/augusdi/article/details/6460415 一、        静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,...

extern,static,const修饰变量的用法

首先看两道道面试题: 变量的定义与声明有啥区别? 首先:变量的定义一定也是变量的初始化,反之则不成立, 在一定的作用域中,变量的声明可以有多个,但是定义只有一个;   -》变量在定义时分配内...

HDOJ_1001关于cin的一点整理

Problem Description Calculate A + B. Input Each line will contain two integers A and B. P...

关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析

最近在看STL,其中讲到容器这一部分的时候,有以下两个式子,有点疑惑: [cpp] view plaincopy dequeint> c(istream_iteratorint...

关于getchar()cin>> 缓冲区的一点发现

#include                                  首先看到右边这些代码 我们输入3  然后按下回车  此时3被送入键盘缓冲区   using namespace st...
  • taoszu
  • taoszu
  • 2015年03月16日 16:04
  • 200

关于cin用法的一点心得

在运行如下程序(比较vector a1和a2是否相等)时 int main() { vector a1,a2; int number; cout while (cin>>number)...

c++,cin.clear用法

  • 2015年03月08日 17:08
  • 25KB
  • 下载

C++输入cin详解

  • 2014年06月01日 10:32
  • 54KB
  • 下载

关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解

几乎所有C++的书籍中都强烈建议函数返回的时候,要使用按引用返回、甚至直接返回指针,尤其是涉及到class和struct的时候。 如果函数返回对象,而不是指针,那么在执行return的时候,...
  • lslxdx
  • lslxdx
  • 2012年04月18日 20:48
  • 1296

C++输入输入 cin cout

  • 2010年06月02日 11:17
  • 7KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于C++中的cin的一点理解
举报原因:
原因补充:

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