目录
1.1.4 read_column_numbers(int columns[], int max)函数:
1.1基础知识:
1.1.1 空白和注释:
- 注释:用来告诉读者程序要进行的功能操作,以及怎样做比较重要;
- 注释以符号 /* 开始,以符号 */ 结束;但是注释不可以嵌套,即第一个 /* 和第一个 */ 之间内容都是注释;
- 要从逻辑上删除一段代码,最好使用 #if 指令,
#if
statements; 在 #if 和 #endif 之间的程序段就可以有效的从程序中去除
#endif
1.1.2 预处理指令:
预处理指令:
- 下面五行代码成为预处理指令,因为他们通过预处理其解释;
-
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_COLS 20 //所能处理的最大列号 #define MAX_INPUT 10000 //每个输入行的最大长度
- 预处理器读入源代码,根据预处理指令对其进行修改,将修改过的源代码交给编译器;
- stdio.h : 此头文件使我们访问标准 I/O 库中的函数,用于执行输入输出;
- stdlib.h : 定义了不同的退出值可能用来标识导致程序的失败的不同原因,ANSIC标准要求使用值0或宏EXIT_SUCCESS来指示程序成功终止,使用宏EXIT_FAILURE指示程序非成功中止。
- string.h :此头文件提供函数来操纵字符串;
- 预处理指令,#define ,把名字MAX_COLS定义为 20;把名字MAX_INPUT 定义为10000;这个名字出现在源文件的任何地方,就被替换成定义的值;
- 预处理指令,#define 定义的字面值常量,不可以出现在赋值符号的左边;一般大写;简单修改定义的数值,即可以修改全程需里的运用数值;
函数原型:
- 一下声明为函数原型;告诉编译器以后将在源文件定义的函数特征;
- 每个原型: 类型名(表示函数返回值类型) 函数名字(见名知意) (函数接受的参数1,参数2,.......)
int read_column_numbers(int columns[], int max);
void rearrange(char *output, char const *input,
int n_columns, int count columns[]);
1.1.3 main函数:
- 每个c函数都必须要有一个main函数;
- int 表示函数返回一个整型值,void表示函数 不接受任何参数;
- 函数内定义了四个变量,一个整型变量.一个整型数组,两个字符数组;
- 四个变量是main函数的局部变量,其他函数不可以根据名字访问,但可以作为参数传给其他函数;
- c语言中,数组传参以引用形式,即地址调用;标量,常量按值传递;
int main(void) {
int n_columns; //进行处理的列标号
int columns[MAX_COLS];
char input[MAX_INPUT];
char output[MAX_INPUT]; //读取串列标号
n_columns = read_column_numbes(columns, MAX_COLS); //读取处理和打印剩余的输入行
while (gets(input) != NULL) {
printf("original input: %s\n", input);
rearrange(output, input, n_columns, columns);
printf("rearranged line: %s\n", output);
}
return EXIT_SUCCESS;
}
- gets函数从标准输入读入一行文本并把它存储于作为参数传递给她的数组中;
- gets函数返回一个非NULL值,表示改行成功读取;
- printf 函数执行格式化的输出;
- 常用printf 格式代码:
格式 | 含义 |
%d | 以十进制形式打印一个整形值 |
%o | 以八进制形式打印一个整形值 |
%x | 以十六进制形式打印一个整形值 |
%g | 打印一个浮点值 |
%c | 打印一个字符 |
%s | 打印一个字符串 |
\n | 换行 |
1.1.4 read_column_numbers(int columns[], int max)函数:
int read_column_numbers(int columns[], int max) {
int num = 0;
int ch;
while (num < max&&scanf("%d", &columns[num]) == 1 && columns[num] >= 0)
num += 1;
//测试程序读取整数是否为偶数个,
if (num % 2 != 0) {
puts("Last colums is not paired.");//puts是gets的输出版本
exit(EXIT_FAILURE);
}
while (ch = getchar() != EOF && ch != '\0')
;
return num;
}
- scanf 函数的所有标量参数前面必须有一个&符号;数组参数前可以不加&;
- 如果数组参数中出现了下标引用,需要加上&符号;
- 常用scanf码:
格式 | 含义 | 变量类型 |
%d | 读取一个整型值 | int |
%ld | 读取一个长整型值 | long |
%f | 读取一个浮点数值 | float |
%if | 读取一个双精度实型值 | double |
%c | 读取一个字符 | char |
%s | 读取一个字符串 | char型数组 |
1.2 基本概念:
1.2.1 环境:
环境:
- 在ANSI C的任何一种实现中,存在两种环境,翻译环境和执行环境;
翻译:
- 多个源文件通过编译过程转换成目标文件;
- 各个目标文件通过链接器捆绑一起,形成单一完整的可执行程序;
- 编译过程: 预处理器处理---->源代码解析----->产生目标代码;
词法规则:
- 字符: C环境规定字符集包括: 所有的大写字母和小写字母; 数字0~9;以及下面符号: ! " # % ' () * , - . ? /: ; < > = [] \ ^ _ { } | ~ ;
- 标准还定义了三字母词,即几个字符的序列;
- 转义序列: \? :书写多个问号 时使用,防止被解释为三字母词; \\ 表示一个反斜杠,防止被解释为一个专一序列符;
- K&R C
转义符 | 表达意义 |
\a | 警告字符,产生可听见或可看见的信号 |
\b | 退格键 |
\f | 进纸字符 |
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | 1~3个八进制数字 |
\xddd | 十六进制数字 |
标识符和关键字:
- 标识符就是变量,函数,类型等的名字;
- 标识符由 大小写字母,数字,下划线组成;
- 不可作为标识符使用的,有32个关键字;
auto | do | goto | signed | unsigned |
break | double | if | sizeof | void |
case | else | int | static | volatile |
char | enum | long | struct | while |
const | extern | register | switch | |
continue | float | return | typedef | |
default | for | short | union |
程序风格:
- 良好的编程风格提高程序可读性,程序更容易正确运行;
- 更易维护,节省资金成本;
- 空格用来分割不停逻辑段代码,
- 操作符使用中间隔有空格,进行缩进语句,使用tab键,
"明 月 光 光 明 月 光,家 住 城 南 谢 家 巷,
春 来 堂 前 花 满 枝, 秋 有 燕 子 绕 北 梁;
.............."