用fprintf()修改代码吧

只要稍作修改,就可以在标准错误中打印错误消息。

用fprintf()修改代码吧 - 图1

现在程序和刚刚一样工作,只是错误消息会显示在标准错误中,而非标准输出中。

运行代码,看看会发生什么。

用fprintf()修改代码吧 - 图2试驾

重新编译程序,再次运行错误的GPS数据,结果如下:

用fprintf()修改代码吧 - 图3

妙哉,这次就算把标准输出重定向到output.json文件,也可以在屏幕上看到错误消息。

创建标准错误的初衷是为了区分普通输出和错误消息。但是别忘了,stderrstdout不过是两个输出流罢了,完全可以用它们做其他事情。

下面就来试试你新学的两个技能:标准输入和标准错误。

用fprintf()修改代码吧 - 图4要点

  • printf()函数把数据发送到标准输出。

  • 默认情况下,标准输出会发送到显示器。

  • 可以在命令行中用>将标准输出重定向到文件。

  • scanf()从标准输入读取数据。

  • 默认情况下,标准输入会从键盘读取数据。

  • 可以在命令行中用<将标准输入重定向到文件。

  • 标准错误专门用来输出错误消息。

  • 可以用2>重定向标准错误。

最高机密

毫无疑问,下面这个程序可以用来传送机密消息:

用fprintf()修改代码吧 - 图5

我们截获了一个叫secret.txt的文件,还有一张小纸片,上面写着指令:

用fprintf()修改代码吧 - 图6

你负责解码这两条机密消息,请把答案写在下面。

用fprintf()修改代码吧 - 图7

最高机密解答

毫无疑问,下面这个程序可以用来传送机密消息:

用fprintf()修改代码吧 - 图8

我们截获了一个叫secret.txt的文件,还有一张小纸片,上面写着指令:

用fprintf()修改代码吧 - 图9

你负责解码这两条机密消息。

用fprintf()修改代码吧 - 图10

用fprintf()修改代码吧 - 图11操作系统零距离

本周访谈主题:

一视同仁

Head First:操作系统,很高兴你抽空参加我们今天的节目。

O/S:分配时间是我的强项。

Head First:你不打算透露你的真实姓名,对吗?

O/S:是的,叫我O/S就行了。

Head First:你属于哪一类操作系统?这个问题你介意回答吗?

O/S:大家总是在争论哪个操作系统好,但对C程序来说,其实我们都差不多。

Head First:是因为有C语言标准库的缘故吗?

O/S:嗯,C语言基本原理是放之四海皆准的。我常说“只要灯一关,我们都一个样”,你明白我在说什么吗?

Head First:当然。现在是你负责把程序载入存储器的吗?

O/S:没错,我把程序变成进程。

Head First:这是很重要的工作,对吗?

O/S:当然啦,你可不能把程序扔到存储器中,让它自生自灭,还有一大堆配置工作要做。我需要为程序分配存储器,把程序和标准数据流连到一起,这样程序才能使用显示器和键盘。

Head First:就像你对geo2json做的那样吗?

O/S:它很傻。

Head First:傻?

O/S:不是说它真傻,而是作为一个工具,它操作起来很简单,好比一台傻瓜相机。

Head First:原来是这样,你会用很多工具吗?

O/S:这其实就是生活,不是吗?要看操作系统,类Unix的操作系统为完成工作会大量使用工具,Windows用的少一些,但也不能没有这些小工具。

Head First:可以创建很多小工具并让它们在一起工作,这是一种哲学,对吗?

O/S:这是一种生活方式。有时当你要解决一个大问题,把它分解成一组更简单的任务,解决起来更容易。

Head First:然后为每个任务都写一个工具?

O/S:没错,然后操作系统,也就是我,负责把这些工具连接起来。

Head First:这种方法有什么好处?

O/S:首先是简单,小程序更容易测试。其次,一旦你写了一个工具,就可以在多个项目中使用。

Head First:就没有什么缺点吗?

O/S:老实说,小工具长得不好看,它们通常在命令行下工作,因此没有吸引眼球的界面。

Head First:这个影响大吗?

O/S:不大,无论是桌面应用程序还是网站,只要你用小工具实现了程序的核心部分,就可以把它们连接到一个好看的界面上。嘿,时间到了,不好意思了,我要抢占你,让其他进程上台。

Head First:好的,谢谢你,O/S。非常高兴……呼……呼……呼……