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

菜鸟一枚,大多数时候都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()在获取输入时,都必须考虑回车情况。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值