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系统中没有试验过。
c++中while(cin>>str)和ctrl z的相关问题探讨的更多相关文章
- Linux中切换前后台命令:ctrl+z,bg,fg,jobs
一.运行某些服务的时候,我希望切换到后台运行: 两种方法: 1.可以在运行的时候,在启动服务命令的最后面加一个字符&,例如 ./serviceStart & 2.在服务启动后,按ctr ...
- C++中标准输入流cin与Ctrl+Z使用时的问题
今天使用C++编写了一段小程序,练习使用标准库的算法,代码如下: #include <iostream> #include <algorithm> #include <v ...
- C++ 输入ctrl+z 不能再使用cin的问题
问题介绍: 程序步骤是开始往容器里面写数据,以Ctrl+Z来终止输入流,然后需要输入一个数据,来判断容器中是否有这个数据. 源代码如下: #include<iostream> #inclu ...
- linux中终端控制键Ctrl+C,Ctrl+Z,Ctrl+D的使用场合
1.Ctrl+C比较暴力,就是发送Terminal到当前的程序,比如你正在运行一个查找功能,文件正在查找中,Ctrl+C就会强制结束当前的这个进程.2.Ctrl+Z是把当前的程序挂起,暂停执行这个程序 ...
- ctrl+c,ctrl+d,ctrl+z在linux中意义
ctrl+c,ctrl+d,ctrl+z在linux中意义 ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. ctrl+c是强制中断程序的执行. ctrl+z的是将任务中断 ...
- linux中ctrl+z和ctrl+c的区别
ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用f ...
- 比如在vi中按ctrl+z
比如在vi中按ctrl+z有个命令可以恢复会话,我忘了,大家谁记得? 分享到: 对我有用[0] 丢个板砖[0] 引用 | 举报| 编辑 删除 管理 回复次数:8 hellwolf hellwo ...
- linux中ctrl+z、ctrl+d和ctrl+c的区别
ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用f ...
- Linux中ctrl+z 、ctrl+c、 ctrl+d区别
ctrl+c,ctrl+d,ctrl+z在linux程序中意义和区别 ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. ctrl+c是强制中断程序的执行,,进程已经终止. ct ...
随机推荐
- Java容器总结
容器总结 Java容器工具包框架图 List,Set,Map三者的区别 List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(注重独一无二的性 ...
- 【JZOJ5264】化学
Description Input Output Sample Input 3 10 1 2 10 Sample Output 5 Hint 题解: 这个题目通过30%部分分的提示,我们可以猜出这 ...
- Mr. Rito Post Office
あなたは離島の郵便局に勤めるプログラマである.あなたの住んでいる地域は,複数の島々からなる.各島には一つ以上の港町がある.それらに加えて他の町や村があるかもしない.ある島から別の島に向かうためには船を ...
- JNDI-Injection-Exploit
介绍 最近把自己之前写的JNDI注入利用工具改了一下push到了github,地址:https://github.com/welk1n/JNDI-Injection-Exploit,启动后这个工具开启 ...
- 网络编程java
网络编程 1.网络编程概述(1).C/S结构:指客户端与服务端结构,常见程序QQ;(2).B/S结构:指浏览器和服务器的结构;2.网络编程的三要素:*IP地址*端口号*通信协议(UDP/TCP) *I ...
- ASP.NET Core API ——Dapper的使用
ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l 创建一个IDBConnection的接口对象 l 编 ...
- 全平台正向tcp端口转发工具rinetd的使用
Linux下做地址NAT有很多种方法.比如haproxy.nginx的4层代理,linux自带的iptables等都能实现.其实,Linux下有一个叫rinetd的工具,安装简单,配置也不复杂. 下载 ...
- go-select
select语句属于条件分支流程控制方法,不过它只能用于通道. select语句中的case关键字只能后跟用于通道的发送操作的表达式以及接收操作的表达式或语句. ch1 := make(chan ) ...
- vue——同一局域网内访问项目
1.想要在手机上访问本地的vue项目,首先要保证手机和电脑处在同一局域网内(连着同一个无线网) 2.将你电脑的ip设置为固定ip(ipconfig查找本地的ip,然后修改它,改为你想变的数字) 3.在 ...
- 记一次 XxlRpcException:xxl-rpc request timeout at 超时问题
事件起因 昨天有同事找我到,说他搭建的 XXL-JOB 任务调度系统不能工作了,调用总是出错(服务端返回 500)希望我能帮忙处理一下,不过说实话我也没有搭建过 XXL-JOB 的经验,但是既然同事请 ...