控制台应用程序暂停功能分析

1.1 第一个控制台应用程序实例 Windows中的控制台程序类似于旧的DOS程序,只支持字符界面。虽然界面类似DOS程序,它和真正的DOS程序有着本质的区别,Windows下的控制台程序依然运行在Win32保护模式下,可以调用大多数的Window API,也可以使用线程等Windows对象。1.1.1 技术要点: 每个控制台应用程序必须有一个名称为“main”的函数(UNICODE版本为wmain),并且这个函数必须是全局函数。系 阅读详情

菜鸟一枚,大多数时候都coding在控制台环境中。因此,在大多数情况下,需要关注打印结果到屏幕,尤其是Release版本。

本文在总结其他coder经验的基础上,主要分析system("pause"), getchar()和cin.get()的使用方法。

一、win32程序暂停之system("pause")————不推荐该方法

该方法分析主要来源于博客http://blog.sina.com.cn/s/blog_6a04befa0100y3t6.html

首先来看MSDN对system()的说明。

microsoft共提供了两个版本:

intsystem( const char *command );   (1)

int_wsystem( const wchar_t *command ); (2)

 

(1) 需要include头文件"stdlib.h"或者"process.h"

(2) 需要include头文件"process.h"或者"stdlib.h"或者"wchar.h"

该函数主要通过传入的command来执行一个命令。于是,看博主(上面给出的链接)的分析,列出了几点不建议使用该方法的理由:

 

1. 不具备可一致性。仅能在windows环境或者dos环境下使用,但是linux, iOS....

2. 效率过低。即如博主所说,调用该函数就像你开挖土机去开你家的前门一样。那么,调用该函数,主要作了哪些工作呢?

  2.1 挂起调用该函数的程序本身;

  2.2 调用操作系统(OS);

  2.3 打开操作系统(OS)的shell;

  2.4 OS查找pause命令;

  2.5 为执行该命令分配相关内存空间;

  2.6 执行该命令,等待按键操作;

  2.7 释放内存空间;

  2.8 退出OS;

  2.9 继续调用该函数的程序。

 

那么,从这里就可以看出调用该函数实现控制台程序暂停功能的效率问题。

 

二、win32程序暂停之system("pause")

 

   在前面分析system("pause")低效率且不具备可移植性的基础上,博主推荐了C语言和C++语言环境下两种不同方式的暂停方式:getchar()和cin.get().

 

 那么,接下来看看getchar()和cin.get()是怎么用的....

老规矩,首先MSDN, MSDN给出了getchar()及功能相同的几个API。

getc, getwc, getchar, getwchar

 

MSDN给出的功能解释:Read acharacter from a stream (getc, getwc), or get a character from stdin (getchar,getwchar).

int getc( FILE *stream );

wint_t getwc( FILE *stream );

int getchar( void );

wint_t getwchar( void );

以上每一个函数调用成功,都会返回读取的这个字符(非字符串哦)。那么,功能看似非常简单。在这里,我们就需要非常慎重的考虑一种情况,那就是回车问题。

好吧,回车。当仅使用getchar()放在代码最后,控制打印结果输出时,回车符也不是问题。

当我们是调用getchar()函数从键盘输入某个字符作为控制命令时,考虑回车符就显得特别重要。我们来看下面的一个demo.

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char a = getchar();
	char b = getchar();

	printf("%c\n", a);
	printf("%c\n", b);

	//此处分析getchar(),因此利用不效率的system()来暂停
	system("pause");
	return 0;
}

编译丨运行。输入第一个a的参数后,回车,可以发现马上打印a,b的结果到屏幕,显示仅a的值,b其实为回车符。这样显示可能不明显,那么我们直接打印输出其ascii码,就能非常直观的看到结果了。

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char a = getchar();
	char b = getchar();

	printf("%d\n", a);
	printf("%d\n", b);

	//此处分析getchar(),因此利用不效率的system()来暂停
	system("pause");
	return 0;
}

那么,你或许会说,我在输入第一个a的值后,空格,然后再输入第二个b的值。实际是一样的,会直接把空格作为b的值传递。因此,在实际应用中,我们若通过这样的方法去获取参数控制,需要有一个临时的存储空间专门存储回车。

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char a = getchar();
	char tmp = getchar();//存回车
	char b = getchar();
	tmp = getchar();//存回车

	printf("%c\n", a);
	printf("%c\n", b);

	//此处分析getchar(),因此利用不效率的system()来暂停
	system("pause");
	return 0;
}

getchar()的分析就到此,本文主要是介绍调用getchar()实现程序暂停。那么接下来cin.get()

#include <iostream>

using namespace std;

int main()
{
	char a = cin.get();
	char b = cin.get();

	cout<<"a: "<<a<<" b: "<<b<<endl;
	return 0;
}

从结果中,我们可以看出,编译|运行后,输入a,然后回车,结果与getchar()完全相同。总结下来就是是:C语言版的getchar()和C++版的cin.get()在获取输入时,都必须考虑回车情况。





掌握Python控制台应用程序开发 Python语言因其简洁明了、易于上手而广受编程初学者和专业人士的喜爱。作为一门高级编程语言,Python在设计上强调代码的可读性和简洁的语法结构,这使得Python成为快速开发应用程序的理想选择。在深入了解Python之前,掌握基础语法是至关重要的。本章将从Python的核心概念出发,简要介绍其基础语法,包括变量、数据类型、运算符以及流程控制等,为后续章节中更复杂的主题打下坚实的基础。让我们从最基本的数据类型开始,逐步探索Python世界的奥秘。在Python中,函数是通过关键字def。 阅读详情

相关推荐

MFC和Win32创建、暂停、删除线程例子

MFC和Win32创建、暂停、删除线程例子,VS2017项目,该项目实现用MFC和Win32Api创建线程对ui操作。

win32控制台停留--ctrl+f5

项目--**属性 完成后要按ctrl+f5

huawei12341的博客 399

在MacBook上直接跑Windows Server 2022:一个开发者的真实踩坑与配置全记录

本文详细记录了在MacBook上原生运行Windows Server 2022的完整流程与优化技巧。通过Boot Camp实现非虚拟机安装,开发者可以充分利用Mac硬件性能,搭建高效的本地开发环境,特别适合需要测试跨平台应用和服务器功能的场景。文章涵盖驱动处理、分区策略、Docker配置等关键步骤,为技术极客提供实用指南。

weixin_42620913的博客 245

MFC中使用控制台输出和取消控制台方法

MFC中使用控制台输出打印和取消控制台方法

m0_52869516的博客 1144

Seafile搭建以及onlyoffice在线办公

部署seafile docker-compose.yml 如下: 参考此篇文章 version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=db_dev # mysql root的密码,同时修改 seafile的DB_ROOT_PASSWD与这个一致 - MYSQL_LOG_CONSOLE

dwdcth的专栏 4656

Device Mapper 代码分析

Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。一、DM

SonicLing的专栏 1万+

WIN32 API部分系统函数的讲解

与贪吃蛇项目有关的的WIN32 API函数的解释,帮助你更好地理解之后的贪吃蛇项目代码

hu_ju_hong的博客 1328

太阳敏感器:卫星姿态控制的“指南针

在卫星姿态控制系统中,太阳敏感器(Sun Sensor) 是至关重要的光学姿态敏感器之一。它通过探测太阳光的方向,为卫星提供关键的姿态参考信息,确保卫星能够正确调整自身方位,维持稳定的对日定向,保障能源供应和任务执行。

ScilogyHunter的博客 1730

C++、C#控制台应用程序暂停下来的方法

一、C++控制台应用程序暂停 //////一、针对Microsoft #include <stdlib.h> //(1)第一种方式 system( "PAUSE "); //(2)第二种方式 getchar(); //(3)第三种方式 Sleep(); ///////二、针对Linux (1)第一种方式 getchar(); /////通用的一种方法是...

菜鸟进阶 1万+

23、关联挖掘到相关性分析及约束关联挖掘详解

本文详细解析了从关联挖掘到相关性分析的发展过程,以及基于约束的关联挖掘方法。文章介绍了传统支持-置信度框架的局限性,并引入Lift、χ2、All Confidence和Cosine等度量来评估规则的相关性。同时探讨了多种规则约束在数据挖掘中的应用机制及其优化效果,旨在提高挖掘效率和规则质量。最后结合实际案例说明如何综合运用相关性度量与规则约束以满足业务需求,并展望了数据挖掘技术的未来发展。

aa123的博客 103

【100%通过率】2024华为OD机试真题E卷 C++ 实现【栈数据合并/空栈压数】

向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设: 栈顶至栈底整数依次编号为n1、n2...nx, n1为最新压入的整数)

MISAYAONE的博客 1553

C语言中窗口暂停,C ++程序中的暂停控制台

C ++程序中的暂停控制台哪种方法可以在C ++程序中暂停控制台?使用system("pause")或使用system("pause")还是使用C函数,例如system("pause")或getchar()?使用2925962487658658160会导致无法移植的代码并且不能在UNIX中工作吗?cin.get()更好地用于暂停控制台吗?Destructor asked 2020-06-16T20...

weixin_42620255的博客 1778

GeoXCP:可解释人工智能中空间解释的不确定性量化

GeoXCP: uncertainty quantification of spatial explanations in explainable AI提出基于保形预测(conformal prediction)的不确定性量化框架——地理空间解释保形预测(GeoXCP),将空间依赖纳入建模过程,生成具有校准不确定性估计的空间自适应解释。通过大量模拟实验和真实世界数据集验证,GeoXCP在不同地理空间场景中能提供可靠解释并有效量化不确定性,推动可解释地理空间机器学习的发展,帮助决策者评估模型驱动洞察的可信度。

May the Force be with you 243

如何阻止C#控制台应用程序自动关闭? [重复]

This question already has an answer here: 这个问题在这里已有答案: Why is the console window closing im

xfxf996的博客 5338

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 730

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C#控制台项目,鼠标点击后线程会暂停

C#控制台应用程序,点击后就会暂停运行,但是我想让它运行不受鼠标点击的影响。

yizhou2010的专栏 420

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【疑难杂症】c#控制台应用程序卡输出

Q: 控制台程序不断输出文本到控制台界面上,偶尔会有卡顿的现象: 鼠标点上去会有一个白色方块,按任意键又可以正常执行。 如以下代码: while(true){ Console.Writeline("running"); Thread.Sleep(1000*5); } A: 如果用户意外地点击黑色控制台窗口,光标将变为一个填充的白色矩形,并且应用程序将在下一个Console.Write语句中挂起,直到另一个clic被创建。 当“快速编辑模式”启用时,它是控制台窗口的通用功能

Zdelta 1837

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

关于:VC控制台结束时暂停

最近使用 VC2010 时,发现某些控制台项目在执行结束后会提示“按任意键继续”,而另一些则会直接退出。   经过对 .vcxproj 文件的一阵 diff 分析后,确定问题在于链接设置中的“子系统”项。只有当该项设置为“控制台”时,控制台输出才会暂停。如果该项没有设置,虽然编译器按照缺省值将它编译为一个控制台程序,但是 IDE 却没有暂停,这或许是 VC2010 IDE 的一个 bug。

dream0411的专栏 1310

控制台应用程序窗口暂停的几种方法

在写一些简单的C++程序时,运行时控制台往往会一闪而过,解决这个问题主要有以下几个方法: 1、system(“pause”); 2、getchar(); 3、sleep(); 4、cin.get(); 只需将上述四种方法的其中一种加到main函数中即可。 ...

Liar_27的博客 7950

在vs2010运行c程序时,控制台一闪而过怎么解决

转载的几个方法如下: 1)你运行的应该是控制台应用程序,需要在main代码最后return0之前添加一个暂停函数,该函数作用为从标准输入获取字符然后程序才会继续运行,比较典型的为c程序中可以用getchar(),getchar()包含在头文件stdio.h中。也可以调用system("pause");,这是一个windows的cmd命令暂停,在控制台程序中体现为获得任意键盘消息后程序继续,被包含在c库stdlib.h中。   2)其实还有一个更好的...

weixin_43668420的博客 1万+

C++回顾 控制台应用程序窗口暂停

一个简单的C++程序,运行以后控制台一闪而过。。。。。。 例: #include using namespace std; int main() { cout } 只需要在main函数里添加 第一种方式 system("pause"); 第二种方式 getchar(); 第三种方式 sleep(); 第四种方式 cin.get(); 中的任意一种就OK了

u011249351的博客 4377

python暂停和恢复游戏,暂停/恢复中间的python脚本

我可以在用户中间暂停正在运行的python脚本(在Windows下),并在用户决定时再次恢复吗?有一个主管理器程序生成,加载和运行其他python脚本(通过从控制台调用python script.py)。我没有GUI,用户可以通过console进行交互。我希望我的主程序能够响应用户 正在运行的脚本的暂停/恢复命令。我应该定义一个线程吗? 方法是什么?编辑/更新:假设我有一个带有前端的小型pytho...

weixin_35801916的博客 1410

c++ 控制台应用程序隐藏dos界面

在一次部署c++控制台应用程序时,碰到一个坑爹的问题,控制台程序总是假死,最后才发现在win10及windows server 2016等系统中点击dos界面默认会暂停应用程序,超级坑爹!!! 最后想了个办法,就是不显示dos界面: /**将此代码复制到main函数所在cpp任何处就ok了**/ #pragma comment( linker, "/subsystem:\"windows\...

David 3183

将空项目设置为控制台应用程序

参考网址: https://docs.microsoft.com/en-us/cpp/build/vscpp-step-1-create?view=vs-2017 Visual Studio可以为Windows和其他平台创建各种应用程序和组件。 空项目模板不是具体什么样的应用程序会创建。要创建一个在控制台或命令提示符窗口中运行的控制台应用程序,您必须告诉Visual Studio构建您的应用程序以...

weixin_37964410的博客 1978
上一篇: 关于中文字符显示为乱码
下一篇: DLL封装学习记录
WTK-CV
博客等级 码龄16年 48粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值