空白和注释
- 注释有时用于把一段代码“注释掉”,也就是使这段代码在程序中不起作用,但并不将其真正从源文件中删除。在C语言中,如果你试图在一段代码的首尾分别加上/*和*/符号来“注释掉”这段代码,你不一定能如愿。如果这段代码内部原先就有注释存在,这样做就会出问题。要从逻辑上删除一段C代码,更好的办法是使用#if指令。只要像下面这样使用:
1 |
|
- 0 不能省略。
预处理命令
- stdio.h头文件使我们可以访问标准I/O 库(Standard I/O Library)中的函数,这组函数用于执行输入和输出。
- string.h头文件提供的函数来操纵字符串, stdlib.h定义了EXIT_SUCCESS和EXIT_FAILURE符号。
main函数
gets函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。
一行输入由一串字符组成,以一个换行符(newline)结尾。
gets函数丢弃换行符,并在该行的末尾存储一个NUL字节 [1] (一个NUL字节是指字节模式为全0的字节,类似’\0’这样的字符常量)。
gets函数返回一个非NULL值,表示该行已被成功读取 [2]。
当gets函数被调用但事实上不存在输入行时,它就返回NULL值,表示它到达了输入的末尾(文件尾)。
[1]NUL是ASCII字符集中‘\0’字符的名字,它的字节模式为全0。NULL指一个其值为0的指针。它们都是整型值,其值也相同,所以它们可以互换使用。然而,你还是应该使用适当的常量,因为它能告诉阅读程序的人不仅使用0这个值,而且告诉他使用这个值的目的。
[2]符号NULL在头文件stdio.h中定义。另一方面,并不存在预定义的符号NUL,所以如果你想使用它而不是字符常量‘\0’,你必须自行定义。
- C语言存在一项约定:字符串就是一串以NUL字节结尾的字符。NUL是作为字符串终止符,它本身并不被看作是字符串的一部分。
1 | "Hello" |
- main函数返回值EXIT_SUCCESS。该值向操作系统提示程序成功执行。
1 | return EXIT_SUCCESS; //加头文件 <stdlib.h> |
- 由于scanf函数的实现原理,所有标量参数的前面必须加上一个“&”符号。数组参数前面不需要加上“&”符号 。但是,数组参数中如果出现了下标引用,也就是说实际参数是数组的某个特定元素,那么它的前面也必须加上“&”符号。
- %s格式码输入字符串时,中间不能包含空白。
- puts函数是gets函数的输出版本,它把指定的字符串写到标准输出并在末尾添上一个换行符。
- getchar函数从标准输入读取一个字符并返回它的值。如果输入中不再存在任何字符,函数就会返回常量EOF(在stdio.h中定义),用于提示文件的结尾。
1 | (ch = getchar() ) != EOF && ch != '\n' |
- EOF是一个整型值,它的位数比字符类型要多,把ch声明为整型可以防止从输入读取的字符意外地被解释为EOF。但同时,这也意味着接收字符的ch必须足够大,足以容纳EOF,这就是ch使用整型值的原因。
程序把columns声明为const就有两方面的作用。
首先,它声明该函数的作者的意图是这个参数不能被修改。
其次,它导致编译器去验证是否违背该意图。
1 | void rearrange( char *output, char const *input, |
声明的两种方式
1 | int const a; |
- strncpy函数把选中的字符从输入行复制到输出行中可用的下一个位置。strncpy函数的前两个参数分别是目标字符串和源字符串的地址。在这个调用中,目标字符串的位置是输出数组的起始地址向后偏移output_col列的地址,源字符串的位置则是输入数组起始地址向后偏移columns[col]个位置的地址。第3个参数指定需要复制的字符数 [8] 。输出列计数器随后向后移动nchars个位置。
1 |
|