关于C++中的cin的一点理解
2015-11-19 12:48
1421 查看
作为一名初学者,常常会遇到用命令行,进行输入的情况,往往输入的是字符或者数字。一开始的时候,我们首先接触的是,
这样的代码。其实cin>>本身也蛮好的,就是不能输入带空格的,这个运算符遇到空格会停止取值。
字符串的储存往往通过string和char数组。和这两个相关的cin函数有get()和getline()。在这两个函数面前该选择哪一个,已经有什么不同,我在网上找了一下资料,发现没有相关的整理,在此发文总结总结。
首先说当需要输入的是char数组的情况,char数组一般的用法是
然后是string的情况,string的一般用法是
string类没有get函数的用法。而且把cin放到getline里面是string类独有的。
其实string类相当于一个const char数组,甚至可以把string的地址赋给一个const char指针。
然后可以通过ch[i]来访问各个字符;甚至不用这么麻烦str[i]本身就是各个字符;
反过来,可以给string用char*来赋值,用snprintf
最后是输入数字,输入数字还是比较简单的cin>>i就可以解决了,不过这里有点小技巧。需要判断输入的是否是数字可以这么做
不过,这里引申出了一个问题就是,下面这样的代码
运行后发现,程序只让输入一次,但是看代码,我们想要的结果是输入两次,我输入一个数字,加了断电看看,i的值是没错,不过temp[0]就是'\0',直接是字符串的末尾了。然后我试着输入一个数字加一个字符串 10code,却发现结果意外得正确。i=10而且code存进了temp数组里,而且我试着讲两者的顺序倒了一下
cin.getline(temp LEN);cin>>i;
结果是正确的,出现了两次输入。所以我做了一个假设,cin.getline会清空cin的缓存区,而cin>>不会。可是这样。
就解释不通了。后来无意中的一个实验让我想清楚了,我们都知道字符串在电脑中的存储方式是,比如"i love coding"是 i love coding\0最后会加上一个\0。而cin读取时会自动把这个给过滤掉,而get和getline不行,所以先cin>>后getline会导致getline读取了一个\0,。所以上面的问题正确的解法是
然后结果就正确啦。
所以我们看cin的时候,要知道这个函数到底会不会自动过滤'\0',以及会将cin的缓存中的指针移动到什么位置。cin读的时候会过滤掉'/0',但只会将指针移到'/0'前。getline读的时候不会过滤掉'/0,但会将指针移到'/0后。get读的时候不会过滤掉'/0,并且将指针停在了'/0前,但如果仅仅发现一开始就是'/0',则会将指针移到'/0'后。
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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息