C 有一系列专门处理字符的函数,ctype.h 头文件包含了这些函数的原型。这些函数接受一个字符作为参数,如果该字符属于某特殊的类别,就返回一个非零值(真);否则,返回口(假)。例如,如果 isalpha() 函数的参数是一个字母,则返回一个非零值。
1234567891011121314// cypher2.c -- 替换输入的字母,非字母字符保持不变#include <stdio.h>#include <ctype.h> // 包含isalpha()的函数原型int main (void) { char ch; while ((ch = getchar()) != '\n') { if (isalpha(ch)) // 如果是一个宇字符, putchar(ch + 1); // 显示该字符的下一个字符 else // 否则, putchar(ch); // 原样显示 } putchar(ch); // 显 ...
在 C 语言中,一直用 int 类型的变量表示 真/假 值。C99 专门针对这种类型的变量新增了 _Bool 类型。该类型是以英国数学家 George Boole 的名字命名的,他开发了用代数表示逻辑和解决逻辑问题。在编程中,表示真或假的变量被称为布尔变量(Boolean variable),所以日 _Bool 是 C 语言中布尔变量的类型名。_Bool 类型的变量只能储存 1(真)或 0(假)。如果把其他非零数值赋给 _Bool 类型的变量,该变量会被设置为 1。这反映了 C 把所有的非零值都视为真。
12345678910111213141516171819// boolean.c 一一 使用 _Bool 类型的变量 variable#include <stdio.h>int main (void) { long num; long sum = 0L; _Bool input_is_good; printf ("Please enter an integer to be summed "); printf (" ...
编程语言
未读1234567891011121314151617181920#include <stdio.h>#include <string.h> // 提供strlen()函数的原型#define DENSITY 62.4 // 人体密度(单位:磅/立方英尺)int main () { float weight, volume; int size, letters; char name [40]; // name 是一个可容纳40个宇符的数组 printf("Hi! What's your first name?\n"); scanf("%s", name); printf("%s, what's your weight in pounds?\n", name); scanf("%f", &weight); size = sizeof name; letters = strlen(name); volume = weight / ...
编程语言
未读目标代码文件、可执行文件和库C 编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。
典型的 C 实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C 使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。
中间文件有多种形式。我们在这里描述的是最普遍的一种形式,即把源代码转专换为机器语言代码,并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件)。虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。因为目标文件中储存的是编译器翻译的源代码,这还不是一个完整的程序。
目标代码文件缺失启动代码(startup code)。启动代码充当着程序和操作系统之间的接口。例如,可以在 MS Windows 或 Linux 系统下运行 1BM PC 兼容机。这两种情况所使用的硬件相同,所以目标代码相同,但是 Win ...
如下,输入一个数组和一个目标变量:
input: [1, 3, 1, 3, 2, 2, 5, -1]
input: 4
要求找到此数组中所有两数之和等于目标变量的元素集合并返回,并且结果中不能有重复项。
思路遍历数组,将当前元素以及其与目标变量的差值存放入字典中,如果字典中已存在,则将其放入结果集中。遍历完成之后,利用Set 集合去重,最后返回。
代码1234567891011121314151617func twoSum(_ array: [Int], _ target: Int) -> [[Int]] { var dict = [Int: Int]() var result = [[Int]]() for item in array { if let num = dict[item] { result.append([num, item]) } dict[target - item] = item } var resultSet: Set<Int> = [] for (i ...
文章翻译
未读我们都知道有的程序员能创造 10 倍的价值,那么我们是吗?
根据 20 世纪 60 年代进行的一份研究,对开发人员的各种方面(如代码简单性、程序大小、调试技巧、程序执行等)进行了比较。根据这项研究,普遍的共识是,一个优秀的开发人员和一个差劲的开发人员之间的差异可以达到20 倍之多,而中间值在大多数情况下是 10 倍。
这就是说,假设你已经苦干了多年,吸收了所有可能的技术,最终达到了令人垂涎的 10 倍高级开发人员级别。太棒了,恭喜!你应该得到名望和随之而来的尊重。现在你想攀登下一座山:成为一名优秀的技术经理。想想就觉得很美。
等等,让我们花点时间想想。
首先:技术经理到底是谁,与传统项目经理的角色有什么区别?
简单地说,技术经理的职责是计划、安排和管理与 IT 相关的项目,例如支持软件工程、应用程序开发、网络安全等的项目,虽然技术经理的主要管理技能与非技术性的基本管理技能基本类似,但强制性的技术专长(当然还有人际交往技能)才是真正的区别于传统管理者的角色。
所以,这意味着你需要对自己诚实,首先要知道是什么驱使着你。是写代码吗?是设计软件吗?或者,是让团队完成工作,帮助团队在最后期限 ...
macOS
未读截图清晰度截图处理由于笔记截图需要缩放以适应预览视图,所以截图时会出现不清晰的问题。故我们需要用笔记截图的原数据进行渲染绘制。
我们将预览视图分为四大块儿进行处理,分别为,header,note,footer,user info,因为 header 和 footer 只有在设置主题的情况下才可能存在,所以需要将 header,footer 和 user info 分别处理。如下图:
预览视图分区示意
我们将分别截取 header,footer,user info。note 的截图直接使用 pdfDataAndForcePDFAttachments(toRender: Bool) 生成的 image 数据即可,这样可以保持图片的最高清晰度。
我们对 note 截图进行放大两倍绘制,这样就能非常高清。视网膜屏幕截图的像素宽高默认为图片 size 的两倍。我们这里没有使用 lockFocus() 和 unlockFocus() 方法,是因为这个方法的绘制与当前显示器有关,如果显示器设备不是视网膜屏那么绘制出来的图像则并不清晰。所以我们调用 NSBitmapImageRep 手动创建图 ...
在许多方面,苹果的故事都是一些有趣的历史偶然事件将技术融合在一起,创造出比以前更好的东西:OS X 是 MacOS 与 NeXTSTEP 的结合。OC 是 Smalltalk 类面向对象编程与 C 的结合。iCloud 则是苹果移动服务与云平台的结合。
虽然苹果技术栈的许多方面都是如此,但是不得不说苹果技术中的进程通讯走的是“反人类”的道路。
由于不是根据每个节点上最优原则进行设计,苹果的进程间通信解决方案更显得混乱扎堆。结果是,大量重叠,不兼容的 IPC 技术在各个抽象层随处可见。(除了 GCD 还有剪贴板)
Mach Ports
Distributed Notifications
Distributed Objects
AppleEvents & AppleScript
Pasteboard
XPC
从低级内核抽象到高级,面向对象的 API,它们都有各自特殊的表现以及安全特性。但是基础层面来看,它们都是从不同上下文段传递或者获取数据的机制。
Distributed Objects90 年代中 NeXT 全盛时期,分发式对象(DO)是 Cocoa 框架中一个远程消息发 ...
后台进程类型在 macOS 中有四种类型的后台进程。不同之处在下表中进行了总结,并在下面的小节中进行了详细描述。要选择适当类型的后台进程,请考虑以下事项:
它是针对当前登录的用户还是针对所有用户执行某些操作。
它是由单个应用程序使用还是由多个应用程序使用。
它是否需要显示用户界面或启动GUI应用程序。
类型
由 launchd 管理?
在哪种环境下运行
可以显示 UI 吗
Login item
否
用户
是
XPC service
是
用户
否(除非以非常有限的方式使用IOSurface)
Launch Daemon
是
系统
否
Launch Agent
是
用户
不建议
Login items登录项在用户登录时启动,并继续运行,直到用户注销或手动退出。它们的主要用途是允许用户自动打开常用的应用程序,但也可以由应用程序开发人员使用。例如,登录项可用于额外显示菜单或注册全局热键。
例如,许多待办事项应用程序使用登录项来侦听全局热键,并提供允许用户输入新任务的最小 UI。登录项还通常用于显示用户界面项,例如浮动时钟或计时器,或者用于在菜单栏中显示图标。 ...
监听者 (Listener),连接 (Connection) 和导出对象 (Exported Object)在 App 端,我们有一个 connection 对象。每次将数据发给 service 时,我们需要调用 remoteObjectProxyWithErrorHandler 方法来创建一个远程对象代理 (remote object proxy)。
而在service端,则多了一层。首先需要一个 listener,用来监听来自 App 的传入 connection。App 可以创建多个 connection,listener 会在 service 端建立相应的 connection 对象。每个 connection 对象都有唯一的 exported object,在 App 端,通过 remote object proxy 发送的消息就是给它的。
当 App 创建一个到 XPC service 的 connection 时,是 XPC 在管理这个 service 的生命周期,service 的启动与停止都由 XPC runtime 完成,这对 App 来说是透明的。而且如果 ...