作为一名初学者,常常会遇到用命令行,进行输入的情况,往往输入的是字符或者数字。一开始的时候,我们首先接触的是,
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'后。