(十九)cin.get()和system("pause")

编者注:中间内容可能有误,原理请看文章最后。


当我们需要成程序暂停一会,等待按任意键的时候,可以输入

system("pause");


显示的是 


请按任意键继续。。。


也可以输入:

cin.get();


效果和system("pause")相同,但是不显示任何字符。


而且,有时候需要连续输入2个cin.get();


个人总结出的经验是,当你之前使用过cin>>命令,那么就需要加两个,如果之前没有使用,那么仅需要加一个即可。


至于为什么,按说明是因为cin>>没有读取cin命令中输入的回车字符,而被cin.get()读取了,因此第一个读取了回车,第二个等待读取方能暂停,

 

 

 

cin.get()和cin>>:


原因在于,当我们使用cin的时候,实际上是将输入的字符存在缓存区之中,而cin从缓存区抽取字符。


例如:

先有一个cin>> a; 的命令,于是我们需要输入字符。

我们输入123 456

注意:123和456之间有空格或者TAB命令给的空格。


这个时候,我们输入的123 456被存入缓存区。

输入区-->123 456


进入缓存区:

缓存区-->123 456


然后呢,由于cin>>命令的特点,他会以TAB,空格,回车等作为结束输入,即,他在缓存区中读取到在数字3后面有一个空格或者TAB符(显示出来的都是空格),于是,他认为你输入结束了。


如果之后我们有cout<<a; 那么a显示出来的数字则是123,而不是123 456。


上代码:

#include<iostream>  
using namespace std;
int main() {
int a, b;
cin >> a;
cin >> b;
cout << a << "←这是a" << endl;
cout << b << "←这是b" << endl;
system("pause");
return 0;
}


显示结果为:

123 456
123←这是a
456←这是b
请按任意键继续. . .


 

而cin.get()不同,他不以空格或者回车作为结束,相反,他是将回车当做结束符,但是依然保留,那么就会被下一个读取。

上代码:

#include<iostream>  
using namespace std;
int main() {
int a, b;
a= cin.get();
b= cin.get();
cout << a << "←这是a" << endl;
cout << b << "←这是b" << endl;
system("pause");
return 0;
}


在这个代码中,他输出的结果是:

1
49←这是a
10←这是b
请按任意键继续. . .


 

具体情况是,在我们输入1然后打回车之后,他不需要我们输入第二次,而是直接给我们一个反馈结果,即49和10。为什么不是1呢,因为cin.get()读取的是字符串,(按说明是ASCII值),而1的值是49,回车的值是10。

 

假如我们再换一次,上代码:

#include<iostream>  
using namespace std;
int main() {
int a, b;
a= cin.get();
cin >> b;
cout << a << "←这是a" << endl;
cout << b << "←这是b" << endl;
system("pause");
return 0;
}


输入内容为:1回车,2回车。

显示结果为:

1
2
49←这是a
2←这是b
请按任意键继续. . .


 

我们发现,由于cin>>不读取回车,因此第二个输入的数字被正常的显示出来了,而第一个只显示了ASCII值。

 

再上代码:

#include<iostream>  
using namespace std;
int main()
{
int a, b;
cin >> a;
b= cin.get();
cout << a << "←这是a" << endl;
cout << b << "←这是b" << endl;
system("pause");
return 0;
}


输入为1回车

显示为:

1
1←这是a
10←这是b
请按任意键继续. . .


 

我们发现,由于b读取了缓冲区中的回车字符,因此我们无法输入第二次,而被直接显示出来了。其中a显示正常,为1,b显示为回车的ASCII值。

 

那么假如我们输入的不是数字,是字母,会如何?

上代码:

#include<iostream>  
using namespace std;
int main() {
char a, b;
cin >> a;
b= cin.get();
cout << a << "←这是a" << endl;
cout << b << "←这是b" << endl;
system("pause");
return 0;
}


输入:a回车

显示为:

a
a←这是a
 
←这是b
请按任意键继续. . .


 

我们发现,a被正常显示,而b虽然看起来没有正常显示,但其实已经正常显示,显示的为(回车后换行)。

 

而如果输入的变为a b回车。结果则为:

a
a←这是a
 ←这是b
请按任意键继续. . .


 



原理:

我们输入的内容被储存到缓存区,缓存区也在内存之中

①对于cin来说,对于输入的字符,他实际上是在缓存区读取内存地址,然后根据类型读取字符。原则上,他是从遇见的第一个非空格\TAB\换行字符开始读取,读取类型(比如这里是char)的代码,遇见空字符\空格\TAB\换行字符为止。他不会将未读取的空格\TAB\换行符等舍弃。

 

②对于cin.get()来说,他同样是从缓存区开始读取,根据类型读取相应的内存地址,比如(char类型)就读取一个字符,他会读取空格\换行\tab字符。也不会舍弃。

 

③对于cin.getline()来说,他一直读取到换行符为止,然后丢弃换行符。——注意,这个貌似不能对char类型使用,必须是数组或者字符串才行。

 

比如先cin再cin.get():

①我们输入a和回车。这个时候,cin读取了a,没有舍弃换行符,这个时候,缓存区的换行符被cin.get()读取了,于是之后在b的位置,就显示的是换行。

②如果输入的是空格、a、回车。这个时候,cin没有读取空格,读取的是a,cin.get()读取的是回车,最后显示的和①相同。

③如果输入a、tab(tab键)、回车。这个时候cin读取了a,cinget()读取了tab键,于是a显示a,b显示tab键制造出来的长空格。

 

如果是先cin.get()再cin;

①输入d、e然后回车,cin.get()读取d,cin读取e。于是显示d和e;

②输入空格、d然后回车,cin.get()读取空格,cin读取d,于是显示 空格 和d;

③输入空格、空格、d然后回车,cin.get()读取第一个空格,第二个空格被cin舍弃,然后读取了d,显示空格和d;

④输入d回车、e回车,cin.get()读取d,cin舍弃第一个换行符,读取了e,显示d和e;

⑤输入d回车、回车、e回车。cin.get()读取d,cin舍弃了2个换行符,读取了e。显示的是d和e。

 

如果是2个cin.get():

①输入a回车,输出a和换行;原因参上

②输入空格a,输入空格和a;

 

上文用cin.get()替代system("pause");的原理在于:

①当有cin.get()或者cin>>存在的时候,如果缓存区有内容,将被直接读取,如果没有内容,那么就会要求用户输入相应的内容。

②当之前没有cin>>或者其他需要用户输入内容的代码,cin.get()会发现缓存区没有内容,会要求用户输入内容。于是就起了暂停的功能,但又因为没有赋予其变量,因此不会影响其他。

③当之前假如有一个cin>>,那么用户输入的字符串被cin读取,但是还剩余了一个换行符,这个时候,第一个cin.get()读取的便是这个没有被读取的换行符,第二个cin.get()才起到的是暂停的功能。

④假如用户输入的a(tab键)回车,那么就需要3个cin.get()才行。

⑤有时候在cin.get()读取之后,还要加上一个.get(),比如cin.get(a).get()。第一个cin.get(a)是将用户输入的内容赋值给a,第二个.get()读取了换行符。

 

 


你可能感兴趣的:(cin,cin.get)