CTRL+Z 和CTRL + D的区别,在VS2008编译器中。

小湿哥 2012-03-21 01:40:10
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <deque>
using namespace std;
void main()
{
vector<string> svec;
string a,b;
while(cin >> a)
svec.push_back(a);
if(!a.empty())
{
b = svec.front();
cout << b << endl;
b = svec[0];
cout << b << endl;
b = *svec.begin();
cout << b << endl;
}
}


输入字符串时,如果以CTRL+D结束,结果结束不了,无限循环
如果以CTRL+Z结束,直接结束循环,程序往下执行。

但是之前 用过list<int> 型,输入 数字,用CTRL+D,也可结束循环。

求解。
...全文
412 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
while(cin >> a)当执行这一条语句时,如果cin >> a输入的数据合法那么会返回结果不是零的输入流cin,而ctrl+D不是文件结束符,就把ctrl+当成字符处理了,所以结束不了,陷入死循环,

当你用list<int>类型时,当进行输入的时候,如果你输入了ctrl+D,那么就是输入了字符,而list<int>要求你输入整数,那么此时输入是非法的,就使输入流cin返回结果是零的输入流,就退出了循环,

要cin >> a返回的结果来进行判断,当cin >>a 输入合法的数据时,返回的结果非零,否则返回的结果是零
  • 打赏
  • 举报
回复
vector<string> svec;
string a,b;
while(cin >> a)
svec.push_back(a);
当容器内是string类型时,那么对于while(cin>>a)这个循环来说,只有当cin >> a返回0值时或遇到文件结束符ctrl+z,才会结束循环,请注意:ctrl+d 不是文件结束符,对于string类型的变量a来说,即使你输入了ctrl+d,程序也会把ctrl+d 当做字符给a,不会结束循环,而且cin的状态仍然有效,不会为0,所以就无限循环下去,直到遇到文件结束符才结束。

但对于list<int>类型来说就不一样了,比如:
list<int> svec;
int a;
while(cin >> a)
svec.push_back(a);
对于这个while循环来说,只有当cin >> a的返回值为0或遇到文件结束符时才会结束循环,但当你输入ctrl+d时,程序会把ctrl+d当做字符来处理,然而变量a是int类型,那么输入的类型与a的类型不相符,就会使cin处于无效状态,也即是说cin>>a返回了0值,那么当你打回车的时候,就会退出循环,因为此时cin>>a为0了,所以你才会感觉到ctrl+d是结束符了,然而ctrl+d不是文件结束符,只是输入的数据非法,使cin处于无效状态,使cin返回了0结束了循环,你才会产生了错觉,误以为ctrl+d是文件结束符了,

要清楚执行完cin>>a这个表达式后,返回了什么,如果输入数据合法,那么cin>>a的返回值就是非0整数,如果输入数据合法,那么cin>>a的返回值就是0
  • 打赏
  • 举报
回复
而string a;
while(cin >> a) 的话,必须输入CTRL+D 才能结束循环了?
不会结束循环,ctrl+d 不是用来结束字符串输入的,你如果按了ctrl+d,程序会把ctrl+d当做字符给a的,ctrl+z才是结束标志,你如果在输入字符串中输入了空格,那么空格以后的字符都不会给a
  • 打赏
  • 举报
回复
如果 int a;
while(cin >> a) 的话,那么只要输入非数字,随便一个字符串都能结束循环咯?
不会结束循环,但cin的状态已经改变,变成无效状态了,下面再进行输入,也就得不到你想要的数据了
Xomic 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jacicson1987 的回复:]
你的意思是,

如果 int a;
while(cin >> a) 的话,那么只要输入非数字,随便一个字符串都能结束循环咯?

而string a;
while(cin >> a) 的话,必须输入CTRL+D 才能结束循环了?
[/Quote]

(1)不会,试试就知道
(2)这都是vs快捷键,何必纠结?直接点右上角的 × 循环结束!
小湿哥 2012-03-21
  • 打赏
  • 举报
回复
你的意思是,

如果 int a;
while(cin >> a) 的话,那么只要输入非数字,随便一个字符串都能结束循环咯?

而string a;
while(cin >> a) 的话,必须输入CTRL+D 才能结束循环了?
内容概要:本文系统研究了虚拟同步发电机(VSG)在并网过程的惯量-阻尼协同自适应控制策略,结合Simulink仿真与Matlab代码实现,深入探讨其对电网频率稳定的支撑作用。研究内容涵盖VSG的基本建模、双机并联条件下的功率精确分配、微电网黑启动过程、预同步控制技术、虚拟阻抗的引入及其对系统稳定性的影响,并通过根轨迹分析、调节系数对比等方法验证所提控制策略的有效性与鲁棒性。该工作为高比例新能源接入背景下的电力系统提供了增强惯性响应和动态稳定性的解决方案,并构建了一个完整的仿真验证平台。; 适合人群:具备电力系统分析、自动控制理论基础,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制、电力电子变换器控制及电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握虚拟同步发电机的核心运行机理与控制建模方法;② 实现VSG在并网、孤岛切换、黑启动等典型工况下的协同控制仿真;③ 分析惯量与阻尼自适应调控对系统频率动态响应的优化效果;④ 为相关课题研究、高水平论文复现或实际工程项目提供可扩展的仿真模型与技术支持。; 阅读建议:建议结合文提供的Matlab代码与Simulink模型,逐步搭建仿真系统,重点理解控制策略的设计逻辑与参数整定方法,并通过改变负载扰动、并网时机、控制器增益等工况进行对比仿真,深入掌握系统稳定性分析的关键技术与优化路径。
内容概要:本文档是PCI-SIG发布的工程变更通知(ECN),针对PCI Express Base Specification 3.1版本的数据链路层包(DLLP)编码进行两项维护性更新。主要变更包括定义一种新的NOP DLLP(无操作数据链路层包),以支持未来硬件发送端的实现优化,并将所有已分配的DLLP类型编码统一整理至规范的单一表格(Table 3-1),提升文档一致性与可维护性。接收端被要求在不采取任何动作的情况下丢弃NOP DLLP,且该包可携带24位任意负载用于调试或日志记录。文档明确指出此次变更不涉及硬件或软件的功能性改动,对现有系统几乎无影响。; 适合人群:从事PCI Express协议开发、验证的硬件工程师、固件开发者及测试工程师,具备一定高速接口协议基础的技术人员;; 使用场景及目标:①帮助开发人员理解DLLP编码机制及未来硬件优化方向;②为测试规范提供依据,如建议更新Link Test Specification以明确未定义编码测试用例的具体编码选择;③指导协议一致性验证过程对非法或特殊DLLP的处理行为;; 阅读建议:此资源属于标准修订类技术文档,建议结合PCI Express Base Specification 3.1及相关测试规范对照阅读,重点关注Table 3-1的更新、新增的NOP DLLP格式图(Figure 3-10a)及其在链路层处理流程的定位,便于准确理解和实施协议要求。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧