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

来源:互联网 发布:电视网络直播在线观看 编辑:程序博客网 时间:2024/06/18 17:45

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

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

 

0 0
原创粉丝点击