Wishlist 0 ¥0.00

通过这 9 本开源好书学习 C 语言

书是非常私人的东西,编程类书籍也不例外。我们都是通过阅读书籍来帮助掌握某种语言的基本知识。随后又通过阅读书籍来全面探索这门语言的灵活性。我仔细考察了一些我最喜爱的 C 语言书籍,并从其中选出了对我意义最大的九本。

C 语言是一种通用的、面向过程的高级编程语言。也是最具流行度和影响力的编程语言之一。该语言在设计时就被设计为可以通过编译器进行编译,以此来对内存进行底层操作、高效地执行机器指令以及在运行时仅需要最小的支持。很多很多编程语言都得益于 C 语言, C 语言就像是编程界的通用语言一样。

C 语言非常易懂。它允许程序员能够以一种清晰、简单、符合逻辑的方式来组织程序。这是一种非常灵活、实用并且简洁的语言,同时它还具有非常容易读懂的语法。使用 C 语言编写的代码运行非常快。可以非常简单地操作计算机的底层设施。通过编译器的指令可以允许我们为不同体系结构的设备生成同一个版本的程序。

C 语言是自由的。因此学习 C 语言的书籍也是体现了其自由性。快来看看我挑选的开源书籍,有没有哪一本能够吸引你?好好享受它吧!

《 C 语言》( The C Book

作者: Mike Banahan, Declan Brady 和 Mark Doran ,350 页

这本书是为那些已经具备使用现代高级面向过程编程语言的程序员设计的。这本书专注于那些 C 语言的特有之处。尤其是使用 C 语言的方式是这本书所重点关注的。

包含以下章节:

  • 变量及运算法则介绍 – 介绍了 C 语言的基础知识, 包括关键字和标识符,变量声明,实数类型,整型,表达式和运算法则以及常量

  • 控制流及逻辑表达式 – 这一章介绍了在 C 语言中可以用于控制程序流程的几种方法,包括一些尚未介绍的语句。 控制流,逻辑表达式以及奇怪的运算符。

  • 函数 – 函数的类型, 递归,传参数以及链接

  • 数组和指针 – 数组, 指针, 字符处理, sizeof 以及储存空间分配, 函数指针,包含指针的表达式,数组,&运算符以及函数声明

  • 结构体数据类型 – 结构体, 联合体, 位字段, 枚举类型, 限定符、派生类型以及初始化

  • 预处理器 – 预处理器是如何工作的及其相关指令

  • C 语言中的一些特定内容 – 声明, 定义,typedefconst 和 volatile以及序列点

  • 库 – 诊断, 字符处理, 本地化, 与具体实现相关的限制, 数学函数, 非局部跳转, 信号处理, 可变参数, 输入输出, 格式化 I/O, 字符 I/O, 无格式 I/O, 随机访问函数, 通用函数, 字符串处理, 日期和时间

  • C 语言编写的完整程序 – 综合以上内容, main函数的参数, 解析程序参数, 模式匹配程序以及一个难度更大的程序

作者允许读者利用此书做任何他们想做的事情,只需说明作者和版权。经Mike Banahan确认,本书通过知识共享协议发布。

风格的要素—— C 语言版(C Elements of Style

作者 Steve Oualline ,265页

这是一本十分有用的编程风格指南,指导 C 和 C++程序员如何去编写可读性良好的,易懂的,易于维护的程序。不论你是一个学生还是专业程序员,你都能从这本书中提供的技巧和技术中获益,构建优雅可靠的代码。

这本书意在向读者们展示如何在你的程序中融入风格良好的代码。机器仅处理代码,而人类关注于注释。良好的编程风格与这两部分都有关。

我们的最终目标是构建设计良好,编写良好的代码,这种代码对于计算机来说是高效的,同时包含了精心编写的注释用于帮助人类理解程序。这样一来,调试,维护和增强程序,都变得更加容易了。最终还提升了代码的可读性,简洁性,可靠性和可维护性。

在本书中,你可以找到有关编写注释,程序头,变量命名,语句格式化,语句细节,编写预处理器命令,组织目录和创建makefile的指南。

本书通过知识共享协议发布。

《编写你自己的Lisp语言》(Build Your Own Lisp

作者 Daniel Holden ,212页

在学习 C 语言的同时学习如何创造你自己的编程语言——一个最简的Lisp语言(仅用不到1000行代码)。

这本书是为两种人写的,一种是想要学习 C 语言的人,另一种是想要知道如何创建一门语言的人。本书并不适合作为第一本入门书籍,因为你需要一些编程经验才能读懂它的内容。

本书基于 Creative Commons Attribution-NonCommercial-ShareAlike 3.0.协议发布

纸质版可以在Amazon上购买。

《 GNU C 语言参考手册》(The GNU C Reference Manual

作者 Trevis Rothwell, James Youngman ,91页

本书是一本 C 语言参考手册,意在写明C89,C99标准以及当前GNU对标准 C 语言的扩展情况。本书并不适合新手阅读。

包含以下章节:

  • 词法元素——这部分内容描述了预编译之后,组成 C 语言代码的词法元素。包括5种:关键字,标识符,常量,操作符和分隔符

  • 数据类型——研究基础的数据类型,枚举,联合体,结构体,数组,指针,不完全类型,类型修饰词,储存类型修饰词以及重命名类型

  • 表达式和操作符 —— 还介绍了自增/自减,算数操作符,复共轭性,比较操作符,逻辑运算符,位移,位运算符,指针运算符,sizeof,类型转换等等。

  • 语句 —— 标签,表达式,if 语句,switch 语句,while 语句,do 语句,for 语句,代码块,null 语句,goto 语句,break 语句,continue 语句,return 语句以及 typedef 语句

  • 函数 —— 学习函数声明,函数定义,函数调用,参数,变长参数列表,通过指针调用函数,main 函数,递归函数等等。

  • 程序结构和定义域 —— 从宏观上来看程序

  • 一个例程 —— 一个用 C 语言编写的完整程序,包含 C 语言源文件和头文件。这个程序是一个典型“hello world”程序的扩展版,它向我们展示了在 GNU FSF 项目中 C 语言是如何工作的。

本书基于GNU Free Documentation License Version 1.3 及其更新版本发布。

《GNU C 语言编程教程》(The GNU C Programming Tutorial

作者 Mark Burgess, Ron Hale-Evans ,290页

本书以逻辑顺序向读者介绍了 C 语言的基本内容。本书内容涵盖了 C 语言的全部主要内容的细节以及如何使用 C 语言编程,特别强调了GNU/Linux编译器以及相关软件。

一些章节主要介绍了函数,变量以及声明,作用域,表达式和操作符,参数,指针,判定,循环,数组,字符串,输入输出等等。

本书基于GNU Free Documentation 协议 Version 1.1版发布。

《 C 语言基础》(Essential C

作者 Nick Parlante ,45页

这份简短的文档解释了 C 语言全部的常用特性和技术。这份文档十分简洁,因此它的目标人群是已经具有其他编程语言背景的人。

内容包括变量,整型,浮点型,类型提升,截断,操作符,控制结构(if,while,for),函数,数值参数,引用参数,结构体,指针,数组,预处理器以及 C 语言标准库函数。

目录:

  • 简介

  • 基础类型与运算符

  • 控制结构

  • 复杂数据类型

  • 函数

  • 杂项

  • 高级数组与指针

  • 运算符和标准库

根据作者的描述,我们得知这是一本基于开源协议发布的书籍。

《Beej的 C 语言教程》(Beej’s Guide to C Programming

作者 Brian “Beej” Hall ,130 pages

本书试图为那些心存困惑的读者带来一种仅能通过纯粹 C 语言编程而产生的快感。

章节:

  • 构建程序的基本结构块

  • 变量,表达式和,语句。变量就是一个数字的名字——一个 C 语言表达式可以包含其他的表达式以及运算符。文章还介绍了ifwhiledo while以及程序重复执行的for语句。

  • 函数——当程序块变得很大,或是当这些程序块用来执行一些特定的工作时,我们会把它们封装到函数中。

  • 变量(续篇)——探讨了变量的作用域和储存类型

  • 指针——它们是数据在内存中的地址。就像一个整型的值可以是12,一个指针的值就是数据在内存中的地址

  • 结构体——结构体允许你将逻辑上相关的变量分组。随后你可以将其作为一个整体来使用。

  • 数组——一组相关数据的线性集合

  • 字符串—— C 语言中的字符串就是内存中的一组连续的比特,包含了一组字符

  • 动态内存——探讨了malloc(), free(), realloc() 和 calloc() 函数

  • 更多内容——指针运算,typedef,枚举,结构体声明,命令行参数,多维数组,类型转换和类型提升,不完整类型,void指针,NULL指针和static关键字

  • 标准输入输出库——用来进行文件的读写。

  • 字符串操作——用来查找子串的函数,连接字符串的函数,获取字符串长度的函数,等等。

  • 算数——一些可以满足你基本算数需求的函数。

本书基于Creative Commons Attribution-Noncommercial- No Derivative Works 3.0 协议发布。

《现代 C 语言》(Modern C

作者 Jens Gustedt ,310页

本书鼓励读者逐级探索 C 语言的特性。内容一共分为如下五层境界:

  • 第一层——使读者了解最基本的 C 语言程序。了解使用 C 语言的目的和数据结构,以及如何去使用它们

  • 第二层——详细的说明了大部分主要概念以及特性,包括控制结构,数据类型操作符和函数。这一级的主要目的是让读者能够对于这些运行程序必备的知识,有更深刻的理解。

  • 第三层——进入 C 语言的核心部分。详细的解释了指针,让你熟悉 C 语言的内存模型,并且让你了解大多数 C 语言库的接口

  • 第四层——深入理解一些特定的主题。比如性能,重入,原子性,线程及泛型编程

  • 第五层——探讨了作者对这门语言未来发展趋势的理解

本书基于Creative Commons Attribution-Noncommercial- No Derivative Works 3.0 协议发布

《GCC简介》(An Introduction to GCC

作者 Brian Gough ,144页

本书介绍了 GNU C 语言和 C++编译器——gcc 和 g++,它们是 GNU 编译器套装(GCC)的一部分。

本书介绍了如何使用编译器。通过多年以来对邮件列表中的问题的观察,本书带领读者直击 GCC 的重要内容。

章节介绍:

  • 编译c程序——介绍了如何使用gcc来编译 C 语言程序。单个文件或多个文件均可以编译,也可以使用操作系统函数和头文件。

  • 编译选项——介绍了gcc中一些常用的编译选项。这些参数控制一些功能,例如搜索库函数和头文件的路径,提供额外的编译告警和诊断。预处理宏和 C 语言方言。

  • 使用预处理器——描述了cpp(GNU C preprocessor)的使用方法,cpp是GCC的一部分。预处理器会在编译前将代码中的宏展开,当GCC处理c或者c+代码时,预处理器会自动被调用。

  • 编译带有debug信息的程序——提供了一个-g选项用以在中间文件和可执行文件中存储额外的调试信息。这些调试信息使得我们可以追踪错误,将机器指令中的问题定位到源代码中。

  • 优化编译——GCC是一个优化过的编译器。它提供了很多选项,可以加速编译或是减少编译后文件的体积。

  • 编译C++程序——介绍了如何使用GCC编译C++程序以及该语言可以使用的命令行选项。

  • 平台相关选项——介绍了一些常见平台可以使用的选项

  • 排错——GCC提供了一些帮助和诊断选项用于帮助我们定位编译过程中出现的问题。

  • 编译器相关工具——介绍了GCC编译过程中会用到的一些有用的工具。包括用来创建库的 GNU 归档工具 ar,GNU 性能和覆盖率测试程序gprof 和 gcov

  • 编译器是如何工作的——详细介绍了GCC是如何把源文件编译为可执行文件的。编译是一个多阶段过程,涉及很多工具,包括GNU编译器本身,GNU汇编器,以及GNU链接器。在编译过程中使用的各种工具,我们统称为编译链。

  • 检查编译后的文件——介绍了一些用来检查可执行文件和obj文件内容的工具。

  • 常见错误信息——介绍了gcc和g++产生的最常见的错误和告警信息。每种情况都带有原因分析,样例以及建议的解决办法。

  • 获取帮助——如果读者遇到了书中没有提到的问题,还有很多介绍GCC和语言的手册可以参考。

本书基于GNU Free Documentation协议发布


很多 C 语言书籍都可以免费下载,但是可惜的是它们并没有以开源协议来发布,或其基于何种协议并没有明确说明。以下对其进行介绍,排名不分先后:

  • 《C编程导论》( Introduction to C Programming )– 作者 Rob Miles

  • 《新标准 C 语言》(The New Standard C: An Economic and Cultural Commentary) – 作者 Derek M. Jones

  • 《使用标准 C 语言进行面向对象编程》(Object-Oriented Programming with ANSI-C )– 作者 Axel-Tobias Schreiner

  • 《编写零缺陷的 C 语言代码》(Writing Bug-Free C Code) – 作者 Jerry Jongenius

最后,如果你想买一本权威参考书,请认准《C程序设计语言》(The C Programming Language)。这本书非常简练,不适合新手,但是被奉为经典。

Linux Shell 文本处理工具集锦

本文将介绍Linux下使用Shell处理文本时最常用的工具:

find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;

提供的例子和参数都是最常用和最为实用的;

 

我对shell脚本使用的原则是命令单行书写,尽量不要超过2行;

如果有更为复杂的任务需求,还是考虑python吧;

 

find 文件查找

 

  • 查找txt和pdf文件

 

  find . \( -name "*.txt" -o -name "*.pdf" \) -print

 

  • 正则方式查找.txt和pdf

 

  find . -regex  ".*\(\.txt|\.pdf\)$"

-iregex: 忽略大小写的正则

 

  • 否定参数

       查找所有非txt文本

 

   find . ! -name "*.txt" -print

 

  • 指定搜索深度

       打印出当前目录的文件(深度为1)

 

  find . -maxdepth 1 -type f  

 

定制搜索

 

  • 按类型搜索:

 

  find . -type d -print  //只列出所有目录

-type f 文件 / l 符号链接

 

  • 按时间搜索:

 

-atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)

-mtime 修改时间 (内容被修改)

-ctime 变化时间 (元数据或权限变化)

 

  • 最近7天被访问过的所有文件:

 

 find . -atime 7 -type f -print

 

  • 按大小搜索:

       w字 k M G

       寻找大于2k的文件

 

 find . -type f -size +2k

 

按权限查找:

 

  find . -type f -perm 644 -print //找具有可执行权限的所有文件

 

按用户查找:

 

  find . -type f -user weber -print// 找用户weber所拥有的文件

 

找到后的后续动作

 

  • 删除:

删除当前目录下所有的swp文件:

 

  find . -type f -name "*.swp" -delete

 

  • 执行动作(强大的exec)

 

  find . -type f -user root -exec chown weber {} \; //将当前目录下的所有权变更为weber

 

注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;

eg:将找到的文件全都copy到另一个目录:

 

  find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;

 

  • 结合多个命令

tips: 如果需要后续执行多个命令,可以将多个命令写成一个脚本。然后 -exec 调用时执行脚本即可;

 

  -exec ./commands.sh {} \;

 

-print的定界符

 

默认使用'\n'作为文件的定界符;

-print0 使用'\0'作为文件的定界符,这样就可以搜索包含空格的文件;

 

grep 文本搜索

 

grep match_patten file // 默认访问匹配行

 

  • 常用参数

-o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行

-c 统计文件中包含文本的次数

 

  grep -c "text" filename

 

-n 打印匹配的行号

-i 搜索时忽略大小写

-l 只打印文件名

 

  • 在多级目录中对文本递归搜索(程序员搜代码的最爱):

 

  grep "class" . -R -n

 

  • 匹配多个模式

 

  grep -e "class" -e "vitural" file

 

  • grep输出以\0作为结尾符的文件名:(-z)

 

  grep "test" file* -lZ| xargs -0 rm

 

xargs 命令行参数转换

 

xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find;

 

  • 将多行输出转化为单行输出

cat file.txt| xargs

\n 是多行文本间的定界符

 

  • 将单行转化为多行输出

cat single.txt | xargs -n 3

-n:指定每行显示的字段数

 

xargs参数说明

 

-d 定义定界符 (默认为空格 多行的定界符为 \n)

-n 指定输出为多行

-I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时

eg:

 

cat file.txt | xargs -I {} ./command.sh -p {} -1

 

-0:指定\0为输入定界符

eg:统计程序行数

 

find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l

 

sort 排序

 

字段说明:

-n 按数字进行排序 VS -d 按字典序进行排序

-r 逆序排序

-k N 指定按第N列排序

eg:

 

sort -nrk 1 data.txt

sort -bd data // 忽略像空格之类的前导空白字符

 

uniq 消除重复行

 

  • 消除重复行

  sort unsort.txt | uniq 

 

  • 统计各行在文件中出现的次数

  sort unsort.txt | uniq -c

 

  • 找出重复行

  sort unsort.txt | uniq -d

 

可指定每行中需要比较的重复内容:-s 开始位置 -w 比较字符数

 

用tr进行转换

 

  • 通用用法

 

  echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符

  cat text| tr '\t' ' '  //制表符转空格

 

  • tr删除字符

 

  cat file | tr -d '0-9' // 删除所有数字

 

  • -c 求补集

 

  cat file | tr -c '0-9' //获取文件中所有数字

  cat file | tr -d -c '0-9 \n'  //删除非数字数据

 

  • tr压缩字符

tr -s 压缩文本中出现的重复字符;最常用于压缩多余的空格

 

  cat file | tr -s ' '

 

  • 字符类

tr中可用各种字符类:

alnum:字母和数字

alpha:字母

digit:数字

space:空白字符

lower:小写

upper:大写

cntrl:控制(非可打印)字符

print:可打印字符

使用方法:tr [:class:] [:class:]

 

  eg: tr '[:lower:]' '[:upper:]'

 

cut 按列切分文本

 

  • 截取文件的第2列和第4列:

  cut -f2,4 filename

 

  • 去文件除第3列的所有列:

  cut -f3 --complement filename

 

  • -d 指定定界符:

  cat -f2 -d";" filename

 

  • cut 取的范围

N- 第N个字段到结尾

-M 第1个字段为M

N-M N到M个字段

 

  • cut 取的单位

-b 以字节为单位

-c 以字符为单位

-f 以字段为单位(使用定界符)

 

  • eg:

  cut -c1-5 file //打印第一到5个字符

No installation plugin has been enabled - How to fix it

First login to your joomla administratior.
Go to Extensions -> Manage -> Discover
Click Discover button (left top)
After few seconds you should see 3 or 4 plugins with names starting with "Installer - Install from ..."
Click checkbox for all or just for Installer - Install from Upload.
Then click Install button at the top
Now you have to enable them.
Go to Extensions -> Plugins and there find all plugins with "Installer" name , next you should enable them。

Joomla使用ajax.lug.ustc.edu.cn导致网页加载非常慢的解决方法

有一天,我的一个朋友跟我说,他网站的某个页面加载非常慢,让我帮忙解决。

我用Chrome自带的工具(右键 -> Inspect elecment)查看,我发现了问题所在。那个页面加载了Google的一段js

 http://ajax.lug.ustc.edu.cn/ajax/libs/jquery/1/jquery.min.js  


 

Google被墙了,所以,这段js一直加载不出来。找到了问题所在,我以为解决这个问题大概半天就能搞定。

我做得第一步是把网站的代码下载下来,然后搜索含有googleapis的文件

 

  1. grep -R "googleapis" .  

 

然后把里面的googleapis替换成国内360提供的cdn源useso

本想着能大功告成,后来发现还是不行。

那时,我想肯定是模板动态生成的,又在网上找了一堆关于k2插件的配置,说要改变jQuery的配置为如下(登录网站的后台管理进行配置):

本想着大功告成,能安心睡觉了。但还是不行,算了,第二天再解决。

第二天,我仔细分析了一下,为什么只有几个页面加载很慢,其他页面完全没问题?再仔细观察发现加载慢的页面是有图片的,看到了这样的代码:

 

  1. {gallery}case_studies/commercial_bank{/gallery}  
再仔细看,它采用了Content - Simple Image Gallery Pro (by JoomlaWorks)这个插件,然后找到这个插件的设置

 

把jQuery library handling的配置设置为 Do not load the jQuery library(意思是不要从远程加载google的jQuery,因为这个东西也没有用到)就行了。

这下终于大功告成!!

About Us

Since 1996, our company has been focusing on domain name registration, web hosting, server hosting, website construction, e-commerce and other Internet services, and constantly practicing the concept of "providing enterprise-level solutions and providing personalized service support". As a Dell Authorized Solution Provider, we also provide hardware product solutions associated with the company's services.
 

Contact Us

Address: No. 2, Jingwu Road, Zhengzhou City, Henan Province

Phone: 0086-371-63520088 

QQ:76257322

Website: 800188.com

E-mail: This email address is being protected from spambots. You need JavaScript enabled to view it.