C、C++控制台界面编程(V4).pdf
《C、C++控制台界面编程(V4).pdf》由会员分享,可在线阅读,更多相关《C、C++控制台界面编程(V4).pdf(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C/C+控制台界面编程(V 4)( 整理)C/C+控制台控制台界面界面编程编程(V 4)序序言言 教程中的资料一部分来自互联网,作者大多已无法考证,另一部分来自 MSDN,其余部分为本人()自己编写并重新整理、修改、增加和补充一些内容,使之更充实、完善,所有程序均在Visual Studio 2005 SP1 中调试通过(操作系统为 Windows XP SP3),原文很多代码均有语法错误,全部作了更正,部分示例代码的功能也进行了增加,有些示例代码功能稍多,为使示例更有针对性,在保留其知识点的基础上对代码进行了精简,最后提供了几个简易的程序示例,以飨读者。本教程中讲到的内容和所有的示例程序几乎
2、都可以在 VC+6,VS 2005,VS 2008 VS 2010 中编译通过,我个人在整理教程时,也在多个 VC 开发环境以及 XP 和 Win7 下运行过(极个别示例还在 GCC 的编译器中运行过),涉及到的少数 API 在某些版本的操作系统中可能没有,教程中也给出了相应说明,读者可根据喜好在自己的操作系统和开发环境中学习,对操作稍作变通,不必拘泥于 VS 2005,对于 Windows 控制台编程,当前的各种开发环境的区别并不明显。每一个学习 C、C+的人,最先接触到的就是在控制台窗口下进行编程学习,它是一个基于文本模式的黑黑的窗口,它不涉及到复杂的人机交互编程,是深入学习 C、C+最直
3、接、简单的手段。早期的开发都使用 Turbo C(简称 TC)进行开发,由于当时标准不够完善,在 TC 的库中提供了大量自己特有的控制台界面处理函数,时至今日,这些控制台程序好多都无法在主流的 VC 中通过编译(最主要的是头文件 conio.h 中的函数),有时候为了学习和移植早期的代码,需要将这些函数在 VC 中重新实现,本教程提供了这样的参考,并且只介绍输入、输出和界面相关的东西,即只涉及控制台的人机交互方面,其它方面本文档并不涉及。更多的时候,用户学习编程语言最先接触的是控制台的界面,通过本教程可以深入了解界面相关的操作,对于 Win32 窗口界面的程序来说,基于控制台窗口的程序也有很多
4、优点,操作简单、几乎不需要书写与界面相关的代码就能编译并生成可执行文件,这样的程序开发速度非常快,一些对于界面要求不是很高的小工具用它开发,比花更多的时间去处理窗口程序的界面要划得来。从 Windows 2000 以后,Windows 操作系统中的控制台已经不再是那个古老的,只能在 Windows 系统划分的一块内存中模拟运行的 16 位程序了,现在的控制台窗口是一个与窗口程序有着相同特性的特殊窗口程序,说它特殊是它只能显示字符,而且是命令行的,但它几乎支持窗口程序的所有功能,比如多线程、网络通信、以及其它的 Windows 程序开发用的技术等,除了涉及到界面的东西以外,它可以完成你想要的所有
5、功能,当然 Windows 的 API 也可以完全由它来调用。当然,控制台窗口程序也有自己的缺点,它与窗口界面的程序没有可比性。教程中所有的示例全部可以用 C 或 C+来实现,关于这两种语言的使用,教程中不作过多讲解,这里假设读者已经具备了熟练的 C、C+语言功底。对于只学习过 C 语言的读者,也不影响从本教程中获取想要的知识,但最后面的几个示例和小程序,有的用 C+实现,可能会给读者的学习带来不便,见谅。文中如有错误和不足之处,希望各位读者批评、指正。 C/C+控制台界面编程(V 4)( 整理)-1-目录目录 C/C+控制台界面编程(V 4).1 目录.-1-第一部分 控制台界面编程预备知识
6、.1 1)Visual Studio 2005 中控制台程序的类型.1 2)转义字符及格式化输入、输出.1 a)制表符t.2 b)回退字符b.4 c)ASCII 码表.6 d)以%开头的格式控制符.9 e)数据流的格式设置.10 3)C 和 C+库的输入、输出操作.12 a)stdio.h 中的常用输入、输出函数.13 b)basic_stream 中的输入、输出操作.13 4)键盘缓冲区处理.15 5)关于 C/C+中的字符串拼接问题.17 6)怎样从控制台复制粘贴文字.18 7)将批处理 bat 转换为 exe 程序.18 8)在 Visual Studio 2005 中设置控制台程序的图
7、标.18 9)重定向控制台程序的输出.19 第二部分 控制台界面编程详解.20 1)概述.20 2)控制台文本窗口编程的一般控制步骤.21 3)常用窗口操作函数.21 4)文本属性操作.25 5)文本输出.28 6)文本操作示例.28 7)窗口滚动条.34 8)文本滚动和移动.35 9)光标操作.38 10)读取键盘信息.38 11)读取鼠标信息.45 12)结束语.47 第三部分 附录.1 1)分数等级划分工具.1 a)controlio.h 文件.1 b)Main.c 文件.5 2)简易俄罗斯方块.6 a)代码 Main.c 文件.7 3)模拟实现可用鼠标、键盘控制的菜单和窗口.11 C/
8、C+控制台界面编程(V 4)( 整理)-2-C/C+控制台界面编程(V 4)( 整理)1/64 第一部分第一部分 控制台界面编程预备知识控制台界面编程预备知识 1)Visual Studio 2005 中控制台程序的类型中控制台程序的类型 在 VS 2005 中控制台可以支持 MFC、ATL,这些内容在本教程中用不到,创建工程时不用支持它们,所以读者在练习的时候,使用空的工程类型即可,如果向导生成了 main()主函数,那么代码可能如下:(读者最好能知道怎样通过它创建一个工程,并且知道怎样设置这个工程的字符编码方式,在 Visual C+6.0 默认的字符集为多字节的,VS 2005 中默认为
9、大字符集,为考虑移植,代码大多数使用通用字符集来实现。)int _tmain(int argc,_TCHAR*argv)return 0;为便于读者理解,作以下解释:C、C+中 main 主函数可能接收字符数组作为参数,由于 VS 2005 支持不同的字符集,所以 C+标准中对所有字符处理的函数都提供了两个版本,一个为普通的接收多字节型的版本,即 char 型,另一个为接收大字符集的版本,一般要普通版本的函数前有前缀”w”,且对名称作了细微的更改,如果需要这方面的信息可以在 MSDN 中查询,微软对字符处理的所有函数除了提供标准中的两个版本,至少还提供了一个通用版,可同时用于两种字符集(一般由
10、”_t”开头,且利用编译器的_UNICODE(也可写成 UNICODE)宏来实现两种字符集的支持,由于程序的国际化需求,使用大字符集编码越来越重要,读者应在学习 C+的时候就应该适当接触这些内容,本教程中使用通用的字符处理函数,但会在必要的时候把对应的其它两个版本的函数注释出来。如果读者不习惯于这种编程方式,请自己更改调用的字符处理函数,并设置 Visual Studio 2005 的工程属性为使用多字节字符集 上面代码中的_TCHAR 是一个宏(常简写为 TCHAR),当字符集为多字节时相当于 char,当为大字符集时相当于 wchar_t,类似的解释以后不再作解释,读者自行查阅 MSDN
11、即可。2)转义字符及格式化转义字符及格式化输入、输出输入、输出 C 语言中的输出最常用的是利用 printf()实现,要使用它,需要包含 stdio.h 头文件,而 C+则除了使用兼容 C 的这种格式,还可以使用 iostream 输入输出流来实现,使用它的时候除了包含头文件还需指定相应的命名空间 std.使用控制台输出,对于字符格式有精确的要求,所以学 C 语言的读者务必要牢牢掌握 printf()中的格式控制符,学习 C+的则需要掌握流的成员函数和输出流的格式控制。学习 C 语言的读者,还应该掌握 C 语言中的其它输入、输出函数(如 putchar,getchar,getch,puts,g
12、ets 等),学习 C+中的读者则还需要掌握字符串流以及缓冲区的刷新等操作(如 endl,flush 等),以便更好的掌握人机交互行为。(注意输入、输出流的控制符在头文件 iomanip 中,使用之前需要包含)。除此之外,还需要重点掌握 C、C+中的转义字符转义字符,特别是b,n,t,八进制数或十六进制数。以上这些知识在一般的 C、C+书籍中均有详细介绍,这里不再赘述,如果掌握不扎实,是不可能随心所欲的操作控制台的输入输出的,但更多的时候是学会举一反三,迁移运用,下面就转义字符中的b 和t进行一些详细讲解,很多人对于这两个字符根本就没有理解透彻。C/C+控制台界面编程(V 4)( 整理)2/6
13、4 a)a)制表符制表符 t t 默认的控制台共可以显示 80*25 个文字,每一行共 80 个字符,共 25 列,除去最后一行可能因为切换中文输入法需要,至少可以有 24 行文字空间可以操作(注:在控制台程序中,切换输入只能用 Ctrl+空格 来实现,如果对于界面要求非常严格,不允许出现滚动条和任何一丁点破坏界面的操作,那么请记住把最后一行空间留给操作系统的输入法吧,否则你完全无法释怀心里的痛)当然控制台是可以使用一些手段来使它的界面显示文字行数增大的,最多增加到多少行,受计算机屏幕大小决定(后面内容会讲解)每两个制表符在控制台窗口中占据 8 个字符的宽度。这样,一个标准的控制台窗口就会被分
14、成 10*25块单元,每一个单元对应一个制表位,而t 的作用是从当前光标所在的位置跳到所在行最近的一个制表位开始的地方,因此,使用t 所跳过的字符宽度并不是固定的,而是介于 08 个字符之间,这主要是看下一个制表位距离当前光标有多远,制表位用于多行文字在列上对齐是非常方便的,但其完美的程序取决于程序书写者对它的控制。典型的例子是输出 9*9 乘法表:#include stdafx.h int _tmain(int argc,_TCHAR*argv)for(int i=1;i=9;+i)for(int j=1;j=i;+j)_tprintf(_T(%d*%d=%dt),i,j,i*j);_tpr
15、intf(n);_tsystem(_T(pause);return 0;以上是通用字符集下的代码(即可用于两种字符集版本的代码)如果是多字节字符集可以如下书写:#include stdafx.h#include /多了一个头文件包含 int main(int argc,char*argv)for(int i=1;i=9;+i)C/C+控制台界面编程(V 4)( 整理)3/64 for(int j=1;j=i;+j)printf(%d*%d=%dt,i,j,i*j);printf(n);system(pause);/注意需要包含头文件stdlib.h或cstdlib(C+中)return 0;如
16、果是大字符集下可以这样写:#include stdafx.h int main(int argc,wchar_t*argv)for(int i=1;i=9;+i)for(int j=1;j=i;+j)wprintf(L%d*%d=%dt,i,j,i*j);wprintf(Ln);_wsystem(Lpause);return 0;说明:说明:#include stdafx.h 是用向导生成的代码,它相当于包含了两个头文件(其实还有一些其它的东西):#include#include 代码中的 L 表示将字符或字符串转换成大字符集编码,如果不使用表示为多字节编码,使用_T 表示根据当前工程属性的需
17、要,要么与 L 的含义一样,要么相当于不使用,即为通用版本,也可以写成_TEXT,它只是一个宏,在使用的时候,需要将要处理的字符串用括号括起来,但 L 在使用时则可以不用括号。printf 用于多字节字符集环境中,wprintf 用于大字符集环境中,_tprintf 则可以根据工程属性自动选择表示 printf 还是 wprintf,即为通用函数,其它的函数也一样,还有三个字符串的数据类型也是一样的含义,即 char,wchar_t,TCHAR,其中 TCHAR 为通用版本。system 在头文件 stdlib.h 头文件中,其它两个版本则不用包含这个头文件,这个函数的功能是执行系统命令的,它
18、能使用的系统命令在不同的电脑中不相同,如果需要查看,可以在命令行窗口中输入 help即可,但只列举系统提供的,这里给出两个,一个是 system(“pause”)用于暂停执行,并显示一行文字“按任意皱键继续”,另一个是 system(“cls”)用于清除窗口中的文字,其实只要是在系统目录system32 下的可执行文件都可用这个命令执行,所以用户也可以将自己需要的程序(为保证兼容性,最好是命令行的程序)拷到对应的目录中,即可利用 system 执行。代码中:system(“pause”);相当于 C 语言的:printf(“按任意键继续n”);getch();或者是 C+的:cout “按任意
19、键继续”endl;/不需要n C/C+控制台界面编程(V 4)( 整理)4/64 getch();说明:VS 2005 中 getch()getch()相当于函数 _getch()_getch()代码中使用了制表符对齐,当然也可以不用制表符,那样的话,用户只能通过计算每一个表达式的文字长度,并用空格填充不够的地方,才能对齐,代码量会很大,逻辑也会变得复杂,可见合理使用制表符及转义字符可以为输出带来方便。程序中使用的是 C 语言的代码,典型的 C+代码如下(只提供通用版的代码):int _tmain(int argc,TCHAR*argv)for(int i=1;i=9;+i)for(int j
20、=1;j=i;+j)cout i _T(*)j _T(=)i*j _T(t)flush;cout endl;system(pause);return 0;输出代码中的 flash 是刷新缓冲区的,但不向缓冲区插入任何字符,endl 是在缓冲区中插入一个回车符,并刷新(注意n 并不等同于 endl,n 是字符,可以用在任何能用字符的地方,表示换行符,而endl 不是个字符,只用于流输出中,表示向流中插入一个n 字符并刷新缓冲区)。这只是顺便提及一下,如果不明白,可以复习 C+基础,个人觉得学习 C+的读者非常有必要精深的掌握 C 语言,这方面个人觉得 C Primer(蓝色的封面)很精典,另谭浩
21、强的 C 语言程序设计是轻量级的 C 语言经典教程,C+学习开始以复习 C 为基础,推荐 C+Primer Plus(蓝色封面)这本书讲法讲解很完善,对 C+有全面细致的学习后,可以从头到尾精细研究 C+Primer(红色封面)这本书是学习 C+的经典之作,但初学者看起来非常吃力。b)b)回退字符回退字符 b b b 可以让当前光标向后回退一个字符,下一次输出的时候,就会从当前位置输出,如果回退到的地方有文字,那么将会被覆盖(屏幕上会覆盖,如果是在打印机上输出则前后两次输出会重叠在一起),这个字符有着非常重要的作用,在教程的后面会讲述到一个 API 函数,可以让光标跳转到任意位置,也可以完成b
22、 的功能,此处暂不作讲述。b 典型的用途是控制输入,控制台的输入一般不受用户掌控,很容易因为输入过多的字符而导致界面被破坏,当对界面格式要求很严格的时候,不能使用普通的输入函数,除了使用系统检测键盘按键的API 以外,C、C+都可以使用 getch()函数,这个函数与 getchar()作用一样,接收一个字符,但 getch()不回显到屏幕上,而且不使用缓冲区缓存多余字符,保证了用户按下任意一个按键就一定结束这个函数的调用,但 getchar()则需要到按了回车或强制刷新缓冲区才行。所以利用这个函数结合b 就能完成很多功能,比如删除一个字符等。这里为了更好的说明这个问题,给用户提供了一个小程序
23、,用于输入很多个学生的成绩,最后对成绩进行分数等级划分,这个程序使用了其它的一些界面编程技术,这里不对其讲解,用户只需要阅读控制输入数值的代码,并结合界面进行观察就能理解了,具体代码见附录中的源代码分数划分工具,这里仅摘抄输入一个 0-100 之间的分数的代码,用到了b 而且可以使用 BackSpace 来删除输入错误的数字。代码如下:/在控制台程序下输入一个整数/tag=1有下划线,无下划线/return-1表示取消输入 C/C+控制台界面编程(V 4)( 整理)5/64/return-2,-3表示参数不正确/return-5表示进行统计/return-4表示运行出错/n表示待输入数据的最大
24、位数/附:这是早期初学时写的代码,格式、结构均很糟糕,用户根据自己的经验进行改写,特别/是返回值,使用枚举更合理;错误处理使用断言更合理,程序结构应再进行模块化,使逻辑/更清楚;变量名命名毫无意义;代码风格和格式比较杂乱等。此处不再进行旧代码的更改,直/接贴在文档中,只求能说清楚问题即可。/如果移植到VS 2005中请注意代码的字符集为多字节,读者也可以将其改写为大字符集,即通/用字符集 int GetInteger(int n,int tag)int kn=0,s=0,i;char c;if(n=10)printf(n无法输入规定的数据!n);return-2;if(!(tag=1|tag=
25、0)printf(n函数参数不合法!n);return-3;if(tag=1)for(i=0;in;i+)printf(_);for(i=0;i=0&s0)if(tag=0)printf(b b);/这里用到了b else printf(b_b);/这里用到了b if(kn=0)kn=0;else kn-;s=s/10;if(c=0&c=9&knn)printf(%c,c);C/C+控制台界面编程(V 4)( 整理)6/64 s=s*10+c-0;kn+;while(1);printf(n程序出现未知错误!n);return-4;c)c)ASCIIASCII 码表码表 为方便编程时查阅一些常用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 控制台 界面 编程 V4
限制150内