• Copyright(C) NCURSES Programming HOWTO

第一个ncurses hello world 程序

#include <ncurses.h>
/*
Compile: gcc main.c -lncurses
*/
int main()
{  initscr();                 /* 初始化,进入NCURSES 模式*/  printw("Hello World !!!"); /* 在虚拟屏幕上打印Hello, World!!! */  refresh();                 /* 将虚拟屏幕上的内容写到显示器上,并刷新*/  getchar();                 /* 等待用户输入*/  endwin();                  /* 退出NCURSES 模式*/  return 0;
} 

这个程序在显示器屏幕上打印“Hello World !!!”后等待用户按任意键退出。这个小程序展示了如何初始化并进入curses 模式、处理屏幕和退出curses 模式。让我们逐行的分析这个小程序:

关于initscr() 函数

initscr()函数将终端屏幕初始化为curses 模式。它用来清除屏幕上所有的字符,并等待下一部处理。所以在调用其它的curses 函数前,要先调用initscr()函数初始化屏幕。这个函数初始化了curses 系统并且为当前屏幕(也就是“stdscr”)和相关的数据结构分配内存。在以前的计算机上曾经出现过一个极端的例子:因为系统中的可用内存太小,以至于initscr()函数无法分配足够的内存给相关的数据结构,从而导致curses 系统初始化失败。

神秘的refresh()函数

第二行的printw()函数用于把字符串“Hello,World!!!”输出到虚拟的屏幕上。这个函数在用法上和printf()函数很像。不同的是:printw()函数把字符串输出到“stdscr”的虚拟窗口坐标(0,0)上(从显示的结果来看,坐标(0,0)在屏幕的左上角上)。 现在该说说这个神秘的refresh()函数了。在我们使用printw 函数打印“Hello World!!!”时,实际上这个消息打印到了一个叫作“stdscr”的虚拟窗口上,没有被直接输出到屏幕上。printw()函数的作用是不断将一些显示标记和相关的数据结构写在虚拟显示器上,并将这些数据写入stdscr 的缓冲区内。为了显示这些缓冲区中的数据我们必须使用refresh()函数告诉curses系统将缓冲区的内容输出到屏幕上。 通过这种机制程序员能够不断在虚拟屏幕上写数据。然后调用refresh()函数让输出的操作看起来是一次完成的。因为refresh()函数只核查窗口和数据中变动的部分,这种富有弹性的设计提供了一个高效的反馈机制。但是这有时很打击初学者的积极性。因为对于初学者来说忘记在输出后调用refresh()函数是很恼人的错误。不过不用担心,很多人都会犯这样的错误。

关于endwin()函数

最后,别忘了退出curses 模式。否则,在程序结束后你的终端可能会运转得不正常。endwin()函数释放了curses 子系统和相关数据结构占用的内存,使你能够正常返回控制台模式。这个函数必须是在你完成所有的curses 操作以后才可以调用。(译者注:如果你在endwin()函数后再调用其它的curses 的函数。很显然,那些语句不会执行。)说到这里,顺便提醒一下。如果你的程序不能正常地显示东西了。请务必看看initscr()函数和endwin()函数是不是在不该被调用的地方调用了。

第一个ncurses程序: hello world !!!相关推荐

  1. 一个资深程序猿对Python的总结

    1.环境管理:管理 Python 版本和环境的工具. p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令 ...

  2. 第一个spring程序

    第一个spring程序: 第一步:导入jar包. 新建maven项目: <dependency><groupId>org.springframework</groupId ...

  3. 快速搭建第一个Mybatis程序

    一.简介 1.初识Mybatis 2.持久化 3.持久层 4.为什么需要Mybatis 二.第一个Mybatis程序 1.搭建环境 2.创建一个新模块 3.编写代码 4.Junit测试 三.可能遇到的 ...

  4. Linux上运行一个c程序

    b站的视频链接:Linux虚拟机运行c程序_哔哩哔哩_bilibili希望对大家有所帮助,不对的地方还请多多指教!https://www.bilibili.com/video/BV18Q4y1r7st ...

  5. Go:分布式学习利器(1) -- 开发环境搭建 + 运行第一个go程序

    文章目录 为什么要学习 go 开发环境搭建 -- MAC 运行第一个go程序 go 函数的返回值设置 go 函数的命令行参数 为什么要学习 go 在如下几个应用场景的需求下产生了go: 超大规模分布式 ...

  6. 用java实现一个计算器程序_1.2第一个java程序——hello world

    第一个java程序--hello world 实现一个java程序,主要有三个步骤:1.编写源代码,2.编译源代码,3.运行.java的源代码必须先编译,然后才能由JVM解析执行.所以我们程序员第一步 ...

  7. C(第一个C程序) 和 C++ (第一个C++程序)对比碰撞

    个人博客首页(点击查看详情) -- https://blog.51cto.com/11495268 1.简介 C++ 是对 C 的继承.扩展,但从语言角度来说,这是 两种变成语言,就一定存在不同,本文 ...

  8. 区块链c端应用小程序_区块链如何真正起作用? 我建立了一个应用程序向您展示。...

    区块链c端应用小程序 by Sean Han 通过肖恩·韩 区块链如何真正起作用? 我建立了一个应用程序向您展示. (How does blockchain really work? I built ...

  9. 如何开发属于自己的第一个Java程序

    学习java技术都是循序渐进的,搭建好了Java开发环境之后,下面就来学习一下如何开发Java程序.为了让初学者更好地完成第一个Java程序,接下来小编通过几个步骤进行逐一讲解. 1.编写Java源文 ...

最新文章

  1. adb shell root
  2. 使用fluentd管理docker日志
  3. 实习热招 | 想找「NLP」实习机会?这 7 家公司正在等你
  4. 【转】10分钟精通SharePoint - VS开发模板
  5. 学画画软件app推荐_路由器管理软件哪个好?6款路由器管理APP推荐_软件评测
  6. IHttpModule的那些事
  7. 准备将redis引入项目做消息队列使用
  8. Linux中的Ext2、ext3、ext4文件系统如何对磁盘中的文件进行存储和管理
  9. 投影相机,透视相机,弱透视相机和仿射相机的区别和联系
  10. word标题级别编号设置
  11. Markdown 符号表示
  12. 2020年最好用的手机是哪一款_2020年公认最值得入手的3款手机,颜值性能兼具,用三年不亏!...
  13. Unity3d游戏引擎Windy系列教程:常见组件扫盲讲解引入unity所需的脚本语言基础
  14. 开源示波器DS203介绍、原理图学习
  15. 了解一下,Android 10 Build系统
  16. jupyter安装使用
  17. 基于c语言的象棋游戏
  18. 第三周铁人战队学习总结
  19. “ 请找出下面重复的字”
  20. 周末苦逼码代码,为css3的强大所颤抖了

热门文章

  1. 单链表算法设计(含大厂面试题)
  2. MySQL学习-子查询及limit分页
  3. [源码和文档分享]基于JAVA的即时通信软件
  4. 前端如何展示商品属性:SKU多维属性状态判断算法的应用-Vue 实现
  5. 单列布局、两列布局、三列布局
  6. Nginx负载均衡的详细配置及使用案例详解.
  7. 修改uid gid 的起始范围
  8. ATL是如何实现线程安全的引用计数和多线程控制的
  9. 音响上的英文是什么意思_鞋盒上的字母后缀 是什么意思?(上)
  10. 服务器pcie性能最大,首款PCIe 4.0服务器处理器为数据中心加速