c++中while(cin>>str)和ctrl z的相关问题探讨

对于while (cin>>str)和ctrl z的问题,网上有以下解释:

------------------------------------------------------------------------------------------------------------------------------

输入(cin)缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin
就会检测输入缓冲区中是否有了可读的数据。

cin 还会对键盘上是否有作为流结束标志的 Ctrl+Z或者 Ctrl+D 键按下作出检查,其检查的方式有两种:阻塞式以及非阻塞式。

阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进行检查,非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。
阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。还有一个特点,如果输入缓冲区中有可读的数据则不会检测 Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。还有一点需要知道,Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。

Windows系统中一般采用阻塞式检查 Ctrl+Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl+D。

-----------------------------------------------------------------------------------------------------------------------------------

以上的意思是说,在window要按ctrl z + ente才可以结束循环,而在unix系统只要按ctrl D即可

同时,总结一下在本机上的一些实验结果。windows 7 + vs2010

大概程序:

string str;

while (cin >> str)

cout<<str<<endl;

实验结果总结:

当输入 asd(ctrl+z)(enter)时会继续要求键盘输入,然后再输入ff(enter),结果输出是asd→ff

当输入 asd(ctrl+z)sad(enter)时,会同样请求输入,然后再输入ff(enter),结果输出依然是asd→ff,ctrl z后面的sad被忽略了

所以,有一些规律总结出来

(1)当按ctlr z前出现可读数据时,ctrl z+enter会变成‘→’字符,同时同行中ctrl z后面的数据被忽略掉,

而且由于ctrl z+enter变成了‘→’字符,所以cin>>str的读取还没结束,继续请求输入并按下enter才能宣告一次读取结束。

(2)如果需要结束循环,其方法必须该行输入是ctrl z+enter,ctrl z前后不能有任何字符,就连cin>>str不读取的空格符都不行。

最后,该问题在unix系统中没有试验过。

时间: 2024-10-13 02:59:36

c++中while(cin>>str)和ctrl z的相关问题探讨的相关文章

linux中bg、fg、ctrl+z、ctrl+d和ctrl+c的区别

fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 $ pct & 二.ctrl + z 可以将一个正在前台执行的命令挂起三.jobs 查看当前有多少在后台运行的命令 jobs命令执行的结果,+(加号)表示是一个当前的作业,- (减号)表示是一个当前作业之后的一个作业,jobs -l选项可显示所有任务的PID. jobs的状态可以是runn

Linux中切换前后台命令:ctrl+z,bg,fg,jobs

一.运行某些服务的时候,我希望切换到后台运行: 两种方法: 1.可以在运行的时候,在启动服务命令的最后面加一个字符&,例如 ./serviceStart & 2.在服务启动后,按ctrl+z,把服务切换到后台并且暂停,然后用命令:bg number把服务在后台启动,启动后,可以用jobs查看后台的任务 注:number是作业号,在按ctrl+z后,终端会显示服务的作业号,比如我按按ctrl+z后 ^Z[1]+  Stopped                 ./serviceStart那

C++ 输入ctrl+z 不能再使用cin的问题

问题介绍: 程序步骤是开始往容器里面写数据,以Ctrl+Z来终止输入流,然后需要输入一个数据,来判断容器中是否有这个数据. 源代码如下: 1 #include<iostream> 2 #include<map> 3 #include<string> 4 #include<vector> 5 using namespace std; 6 int main() 7 { 8 map<string,vector<int> >my_map; 9

ctrl+c,ctrl+d,ctrl+z在linux中意义

fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& 最经常被用到   这个用在一个命令的最后,可以把这个命令放到后台执行二.ctrl + z     可以将一个正在前台执行的命令放到后台,并且暂停三.jobs     查看当前有多少在后台运行的命令四.fg     将后台中的命令调至前台继续运行   如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查

linux中ctrl+z、ctrl+d和ctrl+c的区别

ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.例如:当你vi一个文件是,如果需要用shell执行别的操作,但是你又不打算关闭vi,因为你得存盘推出,你可以简单的按下ctrl+z,shell会将vi进程挂起~,当你结束了那个shell操作之后,

Linux中ctrl+z 、ctrl+c、 ctrl+d区别

ctrl+c,ctrl+d,ctrl+z在linux中意义和区别 ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. ctrl+c是强制中断程序的执行. ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行. 例如:当你vi一个文件是,如果需要用shell执行别的操作,但是你又不打算关闭vi,因为你得存盘推出,你可以简单的按下ctrl

linux中ctrl+z和ctrl+c的区别

ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.例如:当你vi一个文件是,如果需要用shell执行别的操作,但是你又不打算关闭vi,因为你得存盘推出,你可以简单的按下ctrl+z,shell会将vi进程挂起~,当你结束了那个shell操作之后,

CentOS中Ctrl+Z、Ctrl+C、Ctrl+D的区别

Ctrl+C和Ctrl+Z都是中断命令,但作用不同. 其中,Ctrl+C是强制中断程序.而Ctrl+Z是将任务中断而不结束,在进程中维持挂起状态,与此同时,可以通过fg重启前台被中断的任务,也可以通过bg把中断的任务放到后台执行. (个人理解为Ctrl+C相当于在window的任务管理器中结束任务:Ctrl+Z相当于界面上有两个窗口,其中暗掉的那个,fg相当于点击那个暗掉的窗口,bg相当于最小化那个暗掉的窗口.) Ctrl+D表示一个特殊的二进制值,EOF(没记错的话,应该是-1或结束的意思).

Linux中ctrl+z 、ctrl+c、 ctrl+d差别

ctrl+c,ctrl+d,ctrl+z在linux程序中意义和差别 ctrl+c和ctrl+z都是中断命令,可是他们的作用却不一样. ctrl+c是强制中断程序的运行,,进程已经终止. ctrl+z的是将任务中止(暂停的意思),可是此任务并没有结束,他仍然在进程中他仅仅是维持挂起的状态,用户能够使用fg/bg操作继续前台或后台的任务,fg命令又一次启动前台被中断的任务,bg命令把被中断的任务放在后台运行. 比如:当你vi一个文件是,假设须要用shell运行别的操作,可是你又不打算关闭vi,由于