linux下如何C编程?学习linux系统?

1960人阅读
一、工具的使用
1、学会使用vim/emacs,vim/emacs是linux下最常用的源码编辑具,不光要学会用它们编辑源码,还要学会用它们进行查找、定位、替换等。新手的话推荐使用vim,这也是我目前使用的文本编辑器。
2、学会makefile文件的编写规则,并结合使用工具aclocal、autoconf和automake生成makefile文件。
3、掌握gcc和gdb的基本用法。掌握gcc的用法对于构建一个软件包很有益处,当软件包包含的文件比较多的时候,你还能用gcc把它手动编译出来,你就会对软件包中各个文件间的依赖关系有一个清晰的了解。
4、掌握svn/cvs的基本用法。这是linux,也是开源社区最常用的版本管理系统。可以去试着参加sourceforge上的一些开源项目。
二、linux/unix系统调用与标准C库
系统调用应用软件与操作系统的接口,其重要性自然不用说,一定要掌握。推荐学习资料为steven先生的UNIX环境高级编程(简称APUE)。
三、库的学习
无论是在哪个平台做软件开发,对于库的学习都很重要,linux下的开发库很多,我主要介绍一下我常常用到的一些库。
glib 库是gtk+和gnome的基础库,并具是跨平台的,在linux、unix和windows下都可以用。glib库对于linux平台开发的影响就像 MFC对windows平台开发的影响一样,很多开源项目都大量的使用了glib库,包括gimp、gnome、gaim、evolution和 linux下的集群软件heartbeat。因为glib库自带有基本的数据结构实现,所以在学习glib库的时候可以顺便学习一下基本的数据结构(包括链表、树、队列和hash表)。
2、libxml库
libxml是linux平台下解析XML文件的一个基础库,现在很多实用软件都用XML格式的配置文件,所以也有必要学习一下。
3、readline库
readline 库是bash shell用的库,如果要开发命令行程序,那么使用readline库可以减少很多工作量,比如bash里的命令行自动补全,在readline里就已经有实现,当然你也可以用自己的实现替代库的行为。readline库有很多网站介绍的,只要google一下readline就可以找到一堆了。
4、curses库
curses 库以前是vi程序的一部分,后来从vi里提取出来成为一个独立的库。curses库对于编写终端相关的程序特别有用,比如要在终端某一行某一列定位输出,改变终端字体的颜色和终端模式。linux下的curses库用的是GNU实现的ncurses(new curses的意思)。
5、gtk+和KDE库
这两个库是开发GUI应用程序的基础库,现在linux下的大部份GUI程序都是基于这两个库开发的,对于它们 的学习也是很有必要的。
四、网络的学习
网络这个东西太宽了,推荐学习资料steven先生的UNIX网络编程(简称UNP)和TCP/IP协议详解,更进一步的话可以学习使用libnet编写网络程序。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:106235次
排名:千里之外
转载:31篇
(1)(1)(1)(1)(1)(2)(2)(5)(1)(1)(2)(2)(2)(2)(7)(1)(3)14428人阅读
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&本文原创 ,转载必须注明出处 :
&&&&&&&&&&从今天开始,下定决心一步一步开始步入Linux殿堂,重新拾起Linux学习时,依然记得大学时代对Linux的囫囵学习,
&& 劲头持续不了几天,就消亡在她那迷惑的外衣下。如今处于对Android系统的究极学习,以及其他很多目的,下定决心把Linux
&& 知识掌握好。
&&&&& 本学习笔记素材来源 :
&&&&&& & &&1、《鸟哥的Linux私房菜_基础学习篇》(电子档)
& &&&&&& &&2、 两篇博文对Linux下C编程gcc命令的认知
&&&&&&&&&&&&&&& &&& &&&&以及 &&&
&& &一 、Linux 操作系统来源&
&&&&&&&&&&&& 大家懂得,省略…..
&&& 二、Linux基本知识
&&&&&&&&&&&&& &说明:&相关截图来自鸟哥那本书,目前我还没好好消化吸收 。还得继续加把劲。
&&&&&&& 1、 Linnux 命令行介绍
&& &例如,我们常见的列出当前目录的文件/文件夹的基本命令为:&&& ls& –al &main
&&&&&&& && 说明: ls&&&&& 为一个command
&&&&&&&&&&&&&&&&&&& & –al&&& 为options& a 表示列出隐藏文件 ; &l 表示 列出文件/文件下的详细信息
&&&&&&&&&&&&&&&&&&&& main& 为 parameter1& &表示仅仅列出以“main“ 开头的文件/文件夹
&& &其他常用的命令包括:
&&&&&&& &ls& &&列出当前目录的所有文件/文件夹信息
&&&&&& & data& 列出当前时间日期
&&&&& && cd&& 切换路径
&&&& &当然了,这么多command---命令超多并且每个用法超多,我们当然不可能如此记得,因此最强大的一个指令就是 man
& 指令了。 该命令的用法如下:
&&&&&&&&&&&&&&&&&&&&&& man command&&
&&&&&&& 即可 , 知晓该command的所有用法了 。
&&&&&&2、Linux文件属性说明:
&&&&&&&&&&&&& 进入Linux后,在任何一目录 键入如下命令 ls -al& (该命令的意思是:详细列出所有文件和文件夹的信息) , 可以看到
&&&& 如下信息,加上了说明信息:&&&&
&&& 相关属性说明:
&&&& &&& &&第一列表达的信息是最重要的了, 图解如下:
&&&&&&&&& 属性详细说明为:
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&& & 其他的属性相对而言就比较好理解了。
&&&&&&& 3、Linux下一些重要目录说明
&&&&&&&&&&&&&&& 一些比较重要的目录有:
&&&&& &&& &&&&&&&&&&&&&&
&&& &&&&&&&&&&&&&&&&&&
&&&& &&&&&&&&&&& &&
&&&&&&&& &&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
三 、 Linux下C编程入门
&&&&& &&& 熟悉了Windows下编程的同学,初次接触Linux下C编程可能很不习惯,因为Linux并没有为我们提供集成开发环境IDE,
&& 例如Windows下的 VC,Visual Studio 等 。但是在Linux下C编程,能给你带来不一样的感受,它可以让你熟悉编译器如何生成
&& 可执行文件的各个步骤等。
&&&&&&&一般来说,生成一个可执行文件需要以下两步:
&&&&&&&&&&1、编译:即编译源文件 ,生成目标文件
&&&&&&&&& 2 、链接:即将相关的目标文件链接起来,生成一个最终可以执行的可执行文件。(在Windows中,命名一般以.exe结束 ;
&&&&&&&&&&& Linux下,则以文件属性-x来标记)
&& &&&& &最后,执行该可执行文件即可看到程序输出了。
&&&&&& &再次强调的一点是,关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间
&&代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把
& 大量的Object File合成执行文件,这个动作叫作链接(link)。
&&&&&&&&总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函&&
&& &数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有
&& &的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001
& & 错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.
& Linux下C编译器利剑GCC 命令初步认知
&&&& GCC编译器是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:
&&&&&&&&&&&
gcc [options] [filenames]
说明:为了下述表达方便,假定存在如下一个简单的C源文件,&
helloword.c &&
hellword.c
int main()
printf(&Hello World&n&);
return 0 ;
&最简单的编译方法是 gcc& hellowrold.c 它会为目标程序生成默认的文件名a.out,直接执行该可执行文件,即可看到输出。
&&&& 例如 在shell中输入以下命令:
&&&&&&&&&&&First Step :&&gcc&helloworld.c&& ↙&(即输入回车键) & & & & Result :即可生成a.out 可执行文件
&&&&&&&&&&&Second&&&&&:&&&./a.out & & & & & & & & & & & & & & & & & & & & & & & & & & Result& : 执行该文件,即可看到程序输出 。
&&&&& options为编译选项,GCC总共提供的编译选项超过100个,但只有少数几个会被频繁使用,我们仅对几个常用选项进行介绍。
&& &-o&&含义:生成目标文件并且为指定生成的目标文件命名 ,
&&&&&&&&&&&&& 例如:& gcc –o& helloworld&& helloworld.c&&&& 那么生成的可执行文件为hello ,而不是a.out
&&&&-c&&含义: -c选项告诉GCC仅把源代码编译为目标代码而跳过汇编和连接的步骤,默认生成文件名为 [file_name].o 。
&&&&&&&&&&PS:& 由于头文件以及引用关系,&我们同样要利用gcc –o&命令为了对相关目标文件进行编译,以便生成一个可执行文件。
假设存在如下源代码,包含了主文件和头文件等
/* main.c */
#include &stdio.h&
#include &first_1.h&
#include &first_2.h&
int main()
printf_str(&This is my first linux c&)
print_to_num(10) ;
return 0 ;
两个头文件
/*printf_1.h */
#define _FIRST_H_
void printf_str(char *str);
/*printf_2.h */
_SECOND_H_
#define _FIRST_H_
void print_to_num(int num);
真正函数实现的源文件
/*printf_1.c */
#include &stdio.h&
#include &first_1.h&
void printf_str(char *str)
printf(&%s
. I am com& , str);
/*printf_2.c */
#include &stdio.h&
#include &first_2.h&
void print_to_num(int value)
int i = 0 ;
for( ;i &i++)
printf(&cur value is %d ##\n& , i);
&编译步骤如下:
&&&&&&&&1 、编译:对不同的源文件生成目标文件(xxx.0)
&&&&&&&&&&&&&&&& gcc& -c&&main.c&&&&&&&&&&&&&& ↙&&&&&&& 生成 main.o& 目标文件
&&&&&&&&&&&&&&&& gcc& -c&&printf_1.c&&&&&&&&& ↙&&&&&&&& 生成 printf_1.o目标文件
&&&&&&&&&&&&&&&& gcc& -c&&printf_2.c&&&&&&&&& ↙&&&&&&&& 生成 printf_2.o目标文件
&&&&&&&2、链接:将相关的目标文件链接起来,并形成可执行文件
&&&&&&&&&&&&&&&& gcc -c& main&&main.o& printf_1.0& printf_2.o&&&&&&&&&&& ↙&& 即可生成可执行文件main
&&&&&&&3、输入 ./main& 即可执行该文件并可看到我们程序结果
&& 关于GCC的更多命令和调试方法,请参考如博客:
&&&&&&&&&&&&&&
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2294557次
积分:10814
积分:10814
排名:第1348名
原创:40篇
评论:1141条
本文博客欢迎转载, 请保留出处。谢谢合作
Android爱好者QQ群: , 希望热爱武汉Android同胞能够加入。
文章:10篇
阅读:926417
文章:17篇
阅读:780081
(1)(1)(1)(1)(1)(2)(4)(1)(4)(3)(4)(4)(2)(4)(6)(2)(2)(3)深入分析Linux下如何对C语言进行编程
字体:[ ] 类型:转载 时间:
本篇文章介绍了,如何在Linux下对C语言进行编程的详细概述。需要的朋友参考下
1.源程序的编译&&& 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c): &int main(int argc,char **argv)& {printf("Hello Linux/n");& }
要编译这个程序,我们只要在命令行下执行: gcc -o hello hello.c gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件. gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息. 知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明. 2.Makefile的编写&&& 假设我们有下面这样的一个程序,源代码如下:
/*& main.c */&#include "mytool1.h"&#include "mytool2.h"
&int main(int argc,char **argv)&{& mytool1_print("hello");& mytool2_print("hello");&}
/*& mytool1.h& */#ifndef _MYTOOL_1_H#define _MYTOOL_1_H
&void mytool1_print(char *print_str);
/*& mytool1.c& */&#include "mytool1.h"&void mytool1_print(char *print_str)&{&& printf("This is mytool1 print %s/n",print_str);&}
/* mytool2.h */#ifndef _MYTOOL_2_H#define _MYTOOL_2_H
&void mytool2_print(char *print_str);
#endif/*& mytool2.c& */&#include "mytool2.h"&void mytool2_print(char *print_str)&{&& printf("This is mytool2 print %s/n",print_str);&}
当然由于这个程序是很短的我们可以这样来编译 gcc -c main.c gcc -c mytool1.c gcc -c mytool2.c gcc -o main main.o mytool1.o mytool2.o 这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译? 为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是: #&& 这是上面那个程序的Makefile文件main:main.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c main.cmytool1.o:mytool1.c mytool1.hgcc -c mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c mytool2.c
有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的. 下面我们学习Makefile是如何编写的. 在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是: target: componentsTAB rule
第一行表示的是依赖关系.第二行是规则. 比如说我们上面的那个Makefile文件的第二行 main:main.o mytool1.o mytool2.o 表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键 Makefile有三个非常有用的变量.分别是$@,$^,$&代表的意义分别是: $@--目标文件,$^--所有的依赖文件,$&--第一个依赖文件. 如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为: # 这是简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^main.o:main.c mytool1.h mytool2.hgcc -c $&mytool1.o:mytool1.c mytool1.hgcc -c $&mytool2.o:mytool2.c mytool2.hgcc -c $&
经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile的缺省规则 .c.o:gcc -c $&
这个规则表示所有的 .o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c这样Makefile还可以变为: # 这是再一次简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^.c.o:gcc -c $&
好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档. 3.程序库的链接 &&& 试着编译下面这个程序
/* temp.c */& #include & int main(int argc,char **argv)&& {&&&&&&&&&printf("Value:%f/n",value);&& }
这个程序相当简单,但是当我们用 gcc -o temp temp.c 编译时会出现下面所示的错误. /tmp/cc33Kydu.o: In function `main':/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log'collect2: ld returned 1 exit status
出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了使用数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的 -L选项指定路径.比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上 -L/home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径. 还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm -o /lib/*.so|grep sin&~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm). 如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢! 4.程序的调试 &&& 我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了. 最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入 -g选项.关于gdb的使用可以看gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一个用.
5.头文件和系统求助 &&& 有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统. 比如说我们想知道fread这个函数的确切形式,我们只要执行 man fread 系统就会输出着函数的详细解释的.和这个函数所在的头文件说明了. 如果我们要write这个函数的说明,当我们执行man write时,输出的结果却不是我们所需要的. 因为我们要的是write这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用 man 2 write. 2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数. 记住不管什么时候,man都是我们的最好助手.
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Linux C编程实战之路 - Linux下C编程概要_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Linux C编程实战之路
Linux下C编程概要
来源:Linux社区&
作者:vincent
由于C语言是进入Linux开发,尤其是Linux底层开发的必备技能,因此掌握C语言也成为很多想从事Linux相关开发工作的朋友的一道坎,C语言较之其他编程语言,特点是简洁高效,没有过多冗余鸡肋的概念,本博客打算用连载的方式,将Linux下的C语言编程所涉及的所有技术点一一剖析和展现,为了避免陷入教条式讲解的歧途,我将采用各个击破的方式,每一篇博客集中讨论关键点问题,让读者一目了然。
打算用点时间将C语言梳理一下,分布在以下10个章节中:
Linux-C成长之路(一):Linux下C编程概要
Linux-C成长之路(二):基本数据类型
Linux-C成长之路(三):基本IO函数操作
Linux-C成长之路(四):运算符
Linux-C成长之路(五):控制流
Linux-C成长之路(六):函数要义
Linux-C成长之路(七):数组与指针
Linux-C成长之路(八):存储类,动态内存
Linux-C成长之路(九):复合数据类型
Linux-C成长之路(十):其他高级议题
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
以下是C语言成长之路第一节:Linux下C编程概要
第一个问题,假设我是一个初学者,我需要学习的第一个知识并非C语言本身,而是可供我编辑、编译、验证乃至调试C语言程序的编程环境,如果你没有一个合适的编程环境,那么C语言的学习将是空中楼阁,无从谈起。
因此我们的第一个任务便是搭建一个属于自己的编程平台,由于针对Linux编程,我推荐大家直接使用Linux系统,Linux系统有许多发行版,选择一个易用的就行了,比如我比较推荐,也是一款很成熟的Linux操作系统,但是redhat作为服务器Linux加载的服务太多,我们拿着这么一台为服务器准备的系统当成PC来用不大合适,比如开关机时间就很长(服务器一般不会天天开关机)。
ubuntu操作系统的安装ISO镜像在网上到处都有,也可以通过ubuntu的官网下载:/。下载下来之后可以安装在虚拟机里,也可以刻成光盘安装在硬盘上,随你喜好。
好了,下面来正式讲解C编程技术。这里,我们先不要着急去学习具体的语法点,而是来个统观全局,看看一个C程序是长成什么样子的,有哪些要注意的地方,撇开语法细节,注重整体的程序编写布局和规范,这是一个非常重要的步骤。就像厨师学厨艺,不是一来就马上学习每一道菜怎么做,而是先观察师傅做出来的菜是什么样的,从大的方面加以学习和模仿,学习如何将菜做的好看,摆放惹眼,然后再考虑好吃,营养丰富等方面,如果一盘菜看起来就让人倒胃口,即使再可口营养再丰富,也是大打折扣的。写代码也是一样的,一开始要学会如何组织你的代码,使人看起来舒服,样式规范,风格一致,然后再来讨论如何使得代码的性能更好,算法更紧凑。搞清写代码的总体要求,这样在后面的细节学习的时候,就有个总绳可以遵循。
下面是一个完整的C程序:
//example1.c#include &stdio.h&#include &string.h&#include &strings.h&
int main(void){& & & & char buf[100];& & & & bzero(buf, 100);
& & & & fgets(buf, 100, stdin);
& & & & printf("you have input %d letters\n", strlen(buf));
& & & & return 0;}
//example1.c#include &stdio.h&#include &string.h&#include &strings.h&
int main(void){& & & & char buf[100];& & & & bzero(buf, 100);
& & & & fgets(buf, 100, stdin);
& & & & printf("you have input %d letters\n", strlen(buf));
& & & & return 0;}
注意观察上面的程序,有这么几个要点需要谨记:
1, 写程序的时候,代码块内部的代码,一定要有缩进,注意到在main函数中,左花括号和右花括号分别各自独占一行,而里面的代码统统缩进8个空格。注意,一定要缩进而且最好统一缩进8个空格,这样做的好处是使得代码块逻辑清晰,结构分明。
2,注意适当的地方要有空格,就像英文文档的普遍书写习惯一样,一般在标点符号的右边都空一下。另外,如果程序中有赋值号&=&也最好在左右两边空格一下,不要让你的代码统统挤在一起。
3,要注意在适当的地方有空行,比如在不同的逻辑块之间,在上面的例子中,写完最开头的三行#include语句之后,是main函数,它们之间没有紧密的逻辑关系,可以空行一下。另外在程序代码中,也要适当空行,不然你的代码将会很快使人疲乏,适当的空行会使生活更美好,而且空行空格是免费的,不要吝啬它们。
上面几点是编程规范,下面再来看看example1.c中具体的代码:
1,最开始的一行是//example1.c& 这是一个注释语句,因为它以两个正斜杠开头。凡是以两个正斜杠//开头的语句,在C语言中都将被视为注释语句,所谓的注释语句就是在编译的时候会被丢弃的语句,这样的语句用于开发者在程序中书写自然语言,来对复杂的代码加以解释,方便阅读。
另外,C语言中的注释还可以是这样的形式:
/*& 这是一行注释,对代码的运行不起任何作用 */
/*& & 这样的注释是C语言的传统风格& & 可以同时注释多行,但是不能嵌套& & 这些注释语句在编译时都将被丢弃*/
上面的注释语句是用/* ... ... */ 包含起来的。写注释是对阅读代码的人负责的表现,如果一个程序的实现逻辑非常复杂,并不能一眼能看懂,那么不加注释对于程序的阅读者和维护者而言将会是一场噩梦。那么注释写什么呢?答案是:写代码的功能,而不是写原理。比如你写了一个函数,这个函数用了高深的数学原理实现了求解某范围内的所有素数,那么你的注释写的就是它的功能:寻找素数。而不是写它是如何运用数学原理找到的。我们都是实用主义者,我们知道怎么用就行了,其他的不关心。
2,接下来的三行是预处理指令#include ....& 所谓的预处理指令就是以#开头的语句。(除了黏贴符##之外,我们以后在讲解复杂宏的时候会讲解)预处理指令其实不是C语言的一部分,这些指令由专门的称之为预处理器的软件cpp来完成,而且#include &xxxxxx.h& 语句的作用就是将所指定的文件直接拷贝到当前行。这些文件的后缀是.h,h的意思就是head的意思,因此这些文件也被称为头文件,它们在哪儿呢?答案是系统的标准头文件路径中,一般是在/usr/include里面。
为什么要包含这三个头文件呢?我们就这个具体的例子而言,第一,我们用了库函数printf(),所以我们要包含stdio.h这个头文件,因为函数printf()的声明在stdio.h里面。同理,函数bzero()和函数strlen()的声明分别放在了strings.h和string.h里面,因此它们都需要被包含。关于函数的声明和使用,在后面详细讲解。
3,接下来是一个main函数:
int main(void){& & & & .... ....}
请注意,C程序中,必须包含这么一个东西。这个叫做main函数的东西是整个程序的入口,换句话讲,不管你的这个函数写在哪里,你的程序执行的时候,都是从这个函数开始的,所以它叫主函数。注意这个主函数的书写规范:int main(void) 前面的int表示这个函数的返回值类型是整型,不可写成void也不可不写,有些书籍上面介绍C语言的时候,主函数的返回值类型不是int,那不是因为书写错了,而是因为那些书所介绍的C语言不是LINUX下的C语言,LINUX是遵循GNU-C语法的,因此我们现在学习的其实是GNU-C,所谓的GNU-C其实是一套在标准C语言的基础上带增强功能的C规范,那些增强的功能需要编译器额外的支持,所以我们用的编译器是gcc,在gcc编译器下的主函数返回值类型必须是int类型。
另外,main函数的参数是void,这表示此程序不需要任何命令行参数。main函数的参数还可以写成这样:main(int argc, char **argv) 这个我们留到后面再讲。
在函数体中,首先是定义了一个数组buf,然后用bzero()将它清零,然后用fgets()函数等待用户的输入,并将用户输入的字符串放置到数组buf中,然后用strlen()函数计算用户刚刚输入了几个字符,然后再用printf()将结果打印到屏幕上。
再来观察一下,程序的最后一行是一个return语句:return 0; 首先,这个return关键字有两个作用,第一:出现在普通函数中的时候,代表返回调用者。第二,出现在主函数中的时候,代表退出整个进程。这里是第二种情况。一旦程序执行到这个return语句,我们的这个程序就game over了! 那么后面的那个0是神马呢?可不可以是1呢? 2呢? 答案是这样的:后面的那个数字就是main函数的退出值,这个退出值将会被传递给我们这个进程的&父进程&! 是的,这个进程是有爸爸的,就像每个人都有父母一样。我们的进程在退出的时候将会把自己的情况报告给它的父进程,一般规则是:正常退出返回0,非正常退出返回非0. 我们的进程寿终而寝,属于正常退出,因此返回了一个0,否则如果是碰到了权限不足、内存不够、参数有误等等异常情况,导致程序无法执行下去,这时可以返回一个非0值来告诉它的老爸。
好了,这就是example1.c& 你学到了多少呢? 这个程序分析完了,我们想要来运行它,怎么运行呢? 很简单,我们使用一款名为gcc的编译器,来对它进行编译,编译的命令如下:
@ubuntu:~$ gcc example1.c -o example1 -Wall
上面的命令,表示使用gcc编译器,将example1.c 编译生成一个叫 example1 的文件,-Wall的意思是将所有的Warning打开,也就是说如果我们写的代码有任何语法问题,都欢迎gcc帮我们显示出来,我们不会怪罪它啰嗦,因为我们要学习嘛。(有时gcc是很罗嗦的,会爆出很多无关痛痒的警告)
这样,你就拥有了一个可执行文件 example1 了,执行它:
上面的命令,表示使用gcc编译器,将example1.c 编译生成一个叫 example1 的文件,-Wall的意思是将所有的Warning打开,也就是说如果我们写的代码有任何语法问题,都欢迎gcc帮我们显示出来,我们不会怪罪它啰嗦,因为我们要学习嘛。(有时gcc是很罗嗦的,会爆出很多无关痛痒的警告)
这样,你就拥有了一个可执行文件 example1 了,执行它:
@ubuntu:~$& ./examplehelloyou have input 5 letters@ubuntu:~$
你输入了一个字符串 hello,程序帮你计算出来,你刚刚输入了 5 个字符。有趣吧? 如果这是你第一次编写程序,能跟你的程序进行交互将会是一个极好的开端,下一节我们继续征战LINUX下C语言编程。
【内容导航】
相关资讯 & & &
& (03月05日)
& (08/05/:15)
& (05月08日)
& (02月09日)
& (08/04/:48)}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信