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