| 编号 | 关键字 | 功能 |
|:---:|:--------:| -------------------- |
| 1 | char | 声明字符型变量或函数 |
| 2 | double | 声明双精度变量或函数 |
| 3 | enum | 声明枚举类型 |
| 4 | float | 声明浮点型变量或函数 |
| 5 | int | 声明整型变量或函数 |
| 6 | long | 声明长整型变量或函数 |
| 7 | short | 声明短整型变量或函数 |
| 8 | signed | 声明有符号类型变量或函数 |
| 9 | struct | 声明结构体变量或函数 |
| 10 | union | 声明共用体(联合)数据类型 |
| 11 | unsigned | 声明无符号类型变量或函数 |
| 12 | void | 声明函数无返回值或无参数,声明无类型指针 |
第二类:控制语句关键字(12个)。
| 编号 | 关键字 | 功能 |
|:---:|:--------:| ------------------------- |
| 1 | for | 一种循环语句,主要用来控制循环语句的执行 |
| 2 | do | 循环语句的循环体,用在 do...while循环中 |
| 3 | while | 循环语句的循环条件 |
| 4 | break | 跳出当前循环 |
| 5 | continue | 结束当前循环,开始下一轮循环 |
| 6 | if | 条件语句 |
| 7 | else | 条件语句否定分支(与 if 连用) |
| 8 | goto | 无条件跳转语句 |
| 9 | switch | 用于开关语句 |
| 10 | case | 开关语句分支 |
| 11 | default | 开关语句中的默认分支 |
| 12 | return | 子程序返回语句(可以带参数,也看不带参数) |
第三类:存储类型关键字(4个)。
| 编号 | 关键字 | 功能 |
|:---:|:--------:| ------------- |
| 1 | auto | 声明自动变量,一般不使用 |
| 2 | extern | 声明变量是在其它文件中声明 |
| 3 | register | 声明寄存器变量 |
| 4 | static | 声明静态变量或者静态函数 |
第四类:其它关键字(4个)。
| 编号 | 关键字 | 功能 |
|:---:|:--------:| ----------------- |
| 1 | const | 声明只读变量 |
| 2 | sizeof | 计算数据类型长度 |
| 3 | typedef | 用以给数据类型取别名 |
| 4 | volatile | 说明变量在程序执行中可被隐含地改变 |
### 2.C语言中变量的命名规则
1. 变量名必须是单个词;
2. 变量名区分大小写;
3. 变量名最多不超过32个字符(根据编译器版本不同而不同);
4. 变量名必须以字母或者下划线打头,之后可以是任意字母、数字或下划线;
5. 变量名中不允许使用下划线以外的标点符号;
6. 变量名不能使用C语言的关键字。
### 3.C语言中的转义字符
| 转义字符 | 意义 | ASCII码值(十进制) |
| ---- | ---------------- | ------------ |
| \a | 响铃(警报) | 007 |
| \b | 退格符,将当前位置移到前一列 | 008 |
| \f | 换页符,将当前位置移到下页开头 | 012 |
| \n | 换行符,将当前位置移到下一行开头 | 010 |
| \r | 回车符,将当前位置移到本行开头 | 013 |
| \t | 制表符,跳到下一个TAB位置 | 009 |
| \v | 垂直制表符 | 011 |
| \\\ | 反斜杠符号 | 092 |
| \' | 单引号符号 | 039 |
| \" | 双引号符号 | 034 |
| \? | 问号符号 | 063 |
| \0 | 空值符号 | 000 |
### 4.C语言中的运算符
1. **算术运算符**
| 编号 | 运算符 | 含义 | 运算示例 | 运算结果 |
|:---:|:---:| ------------ | ------------ | -------- |
| 1 | + | 加法 | 1+2 | 3 |
| 2 | - | 减法
一元相反数 | 2-1
-(6) | 1
-6 |
| 3 | * | 乘法 | 5*3 | 15 |
| 4 | / | 除法 | 5.0/3.0 | 1.666667 |
| 5 | % | 取模 | 5%3 | 2 |
2. **关系和比较运算符**
| 编号 | 运算符 | 含义 | 运算示例 | 运算结果 |
|:---:|:---:| ---- | ------------- | ------- |
| 1 | > | 大于 | 2>1
2>9 | 1
0 |
| 2 | >= | 大于等于 | 2>=1
2>=9 | 1
0 |
| 3 | < | 小于 | 2<1
2<9 | 0
1 |
| 4 | <= | 小于等于 | 2<=1
2<=9 | 0
1 |
| 5 | == | 等于 | 2==1
2==2 | 0
1 |
| 6 | != | 不等于 | 2!=1
2!=2 | 1
0 |
3. **逻辑运算符**
| 编号 | 逻辑运算符 | 说明 | 示例 | 示例运算结果 |
|:---:|:--------:| --- | ---------------------------- | ------------- |
| 1 | && | 逻辑与 | 1&&1
1&&0
0&&0 | 1
0
0 |
| 2 | '\|''\|' | 逻辑或 | 1\|\|1
1\|\|0
0\|\|0 | 1
1
0 |
| 3 | ! | 非运算 | !1
!0 | 0
1 |
4. **位运算符**
| 编号 | 逻辑运算符 | 说明 | 示例 | 示例运算结果 |
|:---:|:-----:| ---- | ---------------------- | ----------- |
| 1 | & | 按位与 | 1&1
1&0
0&0 | 1
0
0 |
| 2 | '\|' | 按位或 | 1\|1
1\|0
0\|0 | 1
1
0 |
| 3 | ~ | 按位取反 | ~1
~0 | 0
1 |
| 4 | ^ | 按位异或 | 1^0
1^1
0^0 | 1
0
0 |
| 5 | << | 按位左移 | 0001<<2 | 0100(二进制) |
| 6 | >> | 按位右移 | 0100>>2 | 0001(二进制) |
5. **赋值运算符**
| 编号 | 运算符 | 运算示例 | 等效运算 |
| --- | ----- | ------------ | ----------------- |
| 1 | = | var = expr | 无 |
| 2 | += | var += expr | var = var + expr |
| 3 | -= | var -= expr | var = var - expr |
| 4 | *= | var *= expr | var = var * expr |
| 5 | /= | var /= expr | var = var / expr |
| 6 | %= | var %= expr | var = var % expr |
| 7 | &= | var &= expr | var = var & expr |
| 8 | ‘\|=’ | var \|= expr | var = var \| expr |
| 9 | ^= | var ^= expr | var = var ^ expr |
| 10 | >>= | var >>= expr | var = var >> expr |
| 11 | <<= | var <<= expr | var = var << expr |
### 5.C语言的运算符优先级
| 优先级 | 运算符 | 关联性(结合方式) |
|:---------:|:------------------------------------:|:---------:|
| 1(最高优先级) | () [] -> . | 左到右 |
| 2 | ! ~ ++ -- + - * & sizeof | 右到左 |
| 3 | * / % | 左到右 |
| 4 | + - | 左到右 |
| 5 | << >> | 左到右 |
| 6 | < <= > >= | 左到右 |
| 7 | == != | 左到右 |
| 8 | & | 左到右 |
| 9 | ^ | 左到右 |
| 10 | '\|' | 左到右 |
| 11 | && | 左到右 |
| 12 | '\|''\|' | 左到右 |
| 13 | ?= | 右到左 |
| 14 | = += -= *= /= %= &= ‘\|=’ ^= <<= >>= | 右到左 |
| 15(最低优先级) | , | 左到右 |
### 6.printf()函数的输出控制符
| 控制符 | 说明 | 支持的数据类型 |
| ---- | ------------------------- | ---------------------------------------------------------------- |
| %d | 按十进制整型数据的实际长度输出,常用。 | short int, int, signed short int, signed int, unsigned short int |
| %ld | 按十进制长整型数据的实际长度输出。 | long int, signed long int |
| %u | 输出无符号整型数据,常用。 | unsigned int, unsigned short int |
| %lu | 输出无符号长整型数据。 | unsigned long int |
| %f | 输出实数,以小数形式输出,常用。 | float, double |
| %.mf | 输出实数时小数点后保留 m 位。 | float, double |
| %c | 输出一个字符,常用。 | char |
| %s | 输出字符串,常用。 | 字符串 |
| %x | 以十六进制形式输出整数。 | unsigned short int, unsigned int |
| %#x | 以十六进制形式输出整数,数据前自动添加0x,常用。 | unsigned short int, unsigned int |
通常情况下,整型数使用%d输出(无符合整型数使用%u输出),浮点数使用%f输出,字符使用%c输出,字符串使用%s输出,十六进制整数使用%#x输出。
### 7.ASCⅡ码表
| Dec十进制 | Hex十六进制 | 缩写/字符 | 解释 |
|:------:|:-------:|:---------------------------:| ------ |
| 0 | 0x00 | NUL(null) | 空字符 |
| 1 | 0x01 | SOH(start of headline) | 标题开始 |
| 2 | 0x02 | STX (start of text) | 正文开始 |
| 3 | 0x03 | ETX (end of text) | 正文结束 |
| 4 | 0x04 | EOT (end of transmission) | 传输结束 |
| 5 | 0x05 | ENQ (enquiry) | 请求 |
| 6 | 0x06 | ACK (acknowledge) | 收到通知 |
| 7 | 0x07 | BEL (bell) | 响铃 |
| 8 | 0x08 | BS (backspace) | 退格 |
| 9 | 0x09 | HT (horizontal tab) | 水平制表符 |
| 10 | 0x0A | LF (NL line feed, new line) | 换行键 |
| 11 | 0x0B | VT (vertical tab) | 垂直制表符 |
| 12 | 0x0C | FF (NP form feed, new page) | 换页键 |
| 13 | 0x0D | CR (carriage return) | 回车键 |
| 14 | 0x0E | SO (shift out) | 不用切换 |
| 15 | 0x0F | SI (shift in) | 启用切换 |
| 16 | 0x10 | DLE (data link escape) | 数据链路转义 |
| 17 | 0x11 | DC1 (device control 1) | 设备控制1 |
| 18 | 0x12 | DC2 (device control 2) | 设备控制2 |
| 19 | 0x13 | DC3 (device control 3) | 设备控制3 |
| 20 | 0x14 | DC4 (device control 4) | 设备控制4 |
| 21 | 0x15 | NAK (negative acknowledge) | 拒绝接收 |
| 22 | 0x16 | SYN (synchronous idle) | 同步空闲 |
| 23 | 0x17 | ETB (end of trans. block) | 结束传输块 |
| 24 | 0x18 | CAN (cancel) | 取消 |
| 25 | 0x19 | EM (end of medium) | 媒介结束 |
| 26 | 0x1A | SUB (substitute) | 代替 |
| 27 | 0x1B | ESC (escape) | 换码(溢出) |
| 28 | 0x1C | FS (file separator) | 文件分隔符 |
| 29 | 0x1D | GS (group separator) | 分组符 |
| 30 | 0x1E | RS (record separator) | 记录分隔符 |
| 31 | 0x1F | US (unit separator) | 单元分隔符 |
| 32 | 0x20 | (space) | 空格 |
| 33 | 0x21 | ! | 感叹号 |
| 34 | 0x22 | " | 双引号 |
| 35 | 0x23 | # | 井号 |
| 36 | 0x24 | $ | 美元符号 |
| 37 | 0x25 | % | 百分号 |
| 38 | 0x26 | & | 和号 |
| 39 | 0x27 | ' | 闭单引号 |
| 40 | 0x28 | ( | 开括号 |
| 41 | 0x29 | ) | 闭括号 |
| 42 | 0x2A | * | 星号 |
| 43 | 0x2B | + | 加号 |
| 44 | 0x2C | , | 逗号 |
| 45 | 0x2D | - | 减号/破折号 |
| 46 | 0x2E | . | 句号 |
| 47 | 0x2F | / | 斜杠 |
| 48 | 0x30 | 0 | 字符0 |
| 49 | 0x31 | 1 | 字符1 |
| 50 | 0x32 | 2 | 字符2 |
| 51 | 0x33 | 3 | 字符3 |
| 52 | 0x34 | 4 | 字符4 |
| 53 | 0x35 | 5 | 字符5 |
| 54 | 0x36 | 6 | 字符6 |
| 55 | 0x37 | 7 | 字符7 |
| 56 | 0x38 | 8 | 字符8 |
| 57 | 0x39 | 9 | 字符9 |
| 58 | 0x3A | : | 冒号 |
| 59 | 0x3B | ; | 分号 |
| 60 | 0x3C | < | 小于号 |
| 61 | 0x3D | = | 等于号 |
| 62 | 0x3E | > | 大于号 |
| 63 | 0x3F | ? | 问号 |
| 64 | 0x40 | @ | 电子邮件符号 |
| 65 | 0x41 | A | 大写字母A |
| 66 | 0x42 | B | 大写字母B |
| 67 | 0x43 | C | 大写字母C |
| 68 | 0x44 | D | 大写字母D |
| 69 | 0x45 | E | 大写字母E |
| 70 | 0x46 | F | 大写字母F |
| 71 | 0x47 | G | 大写字母G |
| 72 | 0x48 | H | 大写字母H |
| 73 | 0x49 | I | 大写字母I |
| 74 | 0x4A | J | 大写字母J |
| 75 | 0x4B | K | 大写字母K |
| 76 | 0x4C | L | 大写字母L |
| 77 | 0x4D | M | 大写字母M |
| 78 | 0x4E | N | 大写字母N |
| 79 | 0x4F | O | 大写字母O |
| 80 | 0x50 | P | 大写字母P |
| 81 | 0x51 | Q | 大写字母Q |
| 82 | 0x52 | R | 大写字母R |
| 83 | 0x53 | S | 大写字母S |
| 84 | 0x54 | T | 大写字母T |
| 85 | 0x55 | U | 大写字母U |
| 86 | 0x56 | V | 大写字母V |
| 87 | 0x57 | W | 大写字母W |
| 88 | 0x58 | X | 大写字母X |
| 89 | 0x59 | Y | 大写字母Y |
| 90 | 0x5A | Z | 大写字母Z |
| 91 | 0x5B | [ | 开方括号 |
| 92 | 0x5C | \ | 反斜杠 |
| 93 | 0x5D | ] | 闭方括号 |
| 94 | 0x5E | ^ | 脱字符 |
| 95 | 0x5F | _ | 下划线 |
| 96 | 0x60 | ` | 开单引号 |
| 97 | 0x61 | a | 小写字母a |
| 98 | 0x62 | b | 小写字母b |
| 99 | 0x63 | c | 小写字母c |
| 100 | 0x64 | d | 小写字母d |
| 101 | 0x65 | e | 小写字母e |
| 102 | 0x66 | f | 小写字母f |
| 103 | 0x67 | g | 小写字母g |
| 104 | 0x68 | h | 小写字母h |
| 105 | 0x69 | i | 小写字母i |
| 106 | 0x6A | j | 小写字母j |
| 107 | 0x6B | k | 小写字母k |
| 108 | 0x6C | l | 小写字母l |
| 109 | 0x6D | m | 小写字母m |
| 110 | 0x6E | n | 小写字母n |
| 111 | 0x6F | o | 小写字母o |
| 112 | 0x70 | p | 小写字母p |
| 113 | 0x71 | q | 小写字母q |
| 114 | 0x72 | r | 小写字母r |
| 115 | 0x73 | s | 小写字母s |
| 116 | 0x74 | t | 小写字母t |
| 117 | 0x75 | u | 小写字母u |
| 118 | 0x76 | v | 小写字母v |
| 119 | 0x77 | w | 小写字母w |
| 120 | 0x78 | x | 小写字母x |
| 121 | 0x79 | y | 小写字母y |
| 122 | 0x7A | z | 小写字母z |
| 123 | 0x7B | { | 开花括号 |
| 124 | 0x7C | "\|" | 垂线 |
| 125 | 0x7D | } | 闭花括号 |
| 126 | 0x7E | ~ | 波浪线 |
| 127 | 0x7F | DEL (delete) | 删除 |
## 二.C语言控制流
### 1.for循环
for循环是C语言中最常用的循环结构,简单示例:
int i, sum=0;
for(i=1; i<=100; i++){
sum += i;
printf("%d\n",sum);
### 2.while循环
while循环是C语言中常用的循环结构,简单示例:
int i=1, sum=0;
while(i<=100){
sum += i;
printf("%d\n",sum);
do-while循环是一种类似于while循环的循环结构,简单示例:
int i=1, sum=0;
sum += i;
}while(i<=100);
printf("%d\n", sum);
### 3.跳出循环
当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。简单示例:
int i=1, sum=0;
while(1){ //循环条件为死循环
sum += i;
if(i>100) break;
printf("%d\n", sum);
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
char c = 0;
while(c!='\n'){ //回车键结束循环
c = getchar();
if(c=='4' || c=='5'){ //按下的是数字键4或5
continue; //跳过当次循环,进入下次循环
putchar(c);
break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
### 4.if-else结构
if-else结构是C语言中最常用的选择结构(也叫分支结构),简单示例:
if(判断条件){
}else{
当语句块中只有单个语句时,可以省略语句块的大括号,简单示例:
if(age >= 18) printf("恭喜,你已经成年,可以使用该软件!\n");
else printf("抱歉,你还未成年,不宜使用该软件!\n");
在if-else结构中,可以省略else,即:
if(判断条件){
if-else 语句也可以多个同时使用,构成多个分支,形式如下:
if(判断条件1){
}else if(判断条件2){
}else if(判断条件3){
}else if(判断条件m){
}else{
### 5.switch-case结构
switch-case结构通常用来代替简单的、多个分支的if-else结构,简单示例:
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
case 7: printf("Sunday\n"); break;
default:printf("error\n"); break;
switch-case结构的两点说明:
1. case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。
2. default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。通常不省略default,而是default后面不写语句,与没有default等效。
### 6.选择结构补充
C语言提供了唯一的一个三目运算符即条件运算符?:,条件运算符可以替代简单的if-else结构,示例:
int iMax(int a, int b)
return a >= b ? a : b;
条件运算符可以使代码看起来更见简练。
## 三.C语言的复合数据类型
### 1.数组
C语言中一组相同数据类型的集合称为数组,数组所包含的每一个数据叫做数组元素,所包含的数据的个数称为数据长度(Length)。数组的定义方式:
dataType arrayName[Length];
数组定义示例:
int m[10]; //定义一个长度为 10的int型数组
char ch[9]; //定义一个长度为 9 的字符型数组
需要注意的是:
1. 数组中每个元素的数据类型必须相同。
2. 数组长度 Length 最好是整数或者常量表达式。
3. 访问数组元素时,下标的取值范围为 0 ≤ index < length,过大或过小都会越界,导致数组溢出,发生不可预测的情况。
4. 数组是一个整体,它的内存是连续的。
数组的初始化有几种方式:
1. 在定义数组的同时赋值,示例:
int a[4] = {20, 345, 700, 22};
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0,示例:
int a[6] = {0}; //所有元素自动初始化为 0
当给全部元素赋值时,可以不给出数组长度,示例:
int a[] = {20, 345, 700, 22}; //等价于int a[4] = {20, 345, 700, 22};
2. 先定义数组,然后给数组赋值,示例:
int a[10];
for(int i=0; i<10; i++){
a[i] = 8;
二维数组定义的一般形式是:
dataType arrayName[length1][length2];
为了便于理解,可以将二维数组看做一个表格,有行有列,length1 表示行数,length2 表示列数,要在二维数组中定位某个元素,必须同时指明行和列。
二维数组的初始化可以按行分段赋值,也可按行连续赋值,通常使用按行分段赋值(因为连续赋值容易出错),示例:
int a[5][3]={{80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85}};
### 2.结构体
在C语言中,可以使用结构体(struct)来存放一组不同类型的数据。结构体的定义形式为:
struct 结构体名{
结构体所包含的变量或数组
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员。一个结构体的示例:
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
结构体是一种数据类型,可以用它来定义变量。示例:
struct stu stu1, stu2;
也可以在定义结构体的同时定义结构体变量:
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。结构体使用点号`.`获取单个成员。获取结构体成员的一般格式为:
结构体变量名.成员名;
通过这种方式可以获取成员的值,也可以给成员赋值:
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5;
除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
对于有很多成员的大型结构体,结构体变量整体赋值时很容易出现成员错位的情况,为了避免出现这种情况,C语言还支持下面这种语法,类似于成员逐一赋值的整体赋值:
struct stu Bangbang = {
.name = "Bangbang",.num = 13,.age = 3,.group = 'A',.score = 98 };
不过整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。
### 3.枚举
C语言提供了一种枚举(Enum)类型,能够列出所有可能的取值,并给它们取一个名字。
枚举类型的定义形式为:
enum typeName{ valueName1, valueName2, valueName3, ...... };
枚举示例:
enum week{ Mon=1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week{ Mon=1, Tues=2, Wed=3, Thurs=4, Fri=5, Sat=6, Sun=7 };
枚举值默认从 0 开始,往后逐个加 1(递增),如果首个值不等于0的话则需要指定值。枚举类型变量需要存放的是一个整数int,因此枚举类型变量的长度与int相同。
### 4.共用体
共用体也称作联合体,共用体的所有成员共同占用(即共用)同一段内存,修改一个成员会影响其余所有成员。共用体示例:
union data{
int n;
char ch[4];
float f;
union data a, b, c; //先定义共用体,再创建变量
union data{
int n;
char ch[4];
float f;
} a, b, c; //在定义共用体的同时创建变量
先定义共用体,再创建变量或者在定义共用体的同时创建变量都是正确的。共用体占用的内存等于最长的成员占用的内存,虽然共用体各个成员的长度可以不同,但实际应用中,通常将各个成员的长度设置为一样长,比如上述示例中共用体成员的长度都是4个字节。
共用体使用点号`.`获取单个成员,这一点与结构体相同。
## 四.C语言常用库函数
### 1.标准输入和输出函数
使用标准输入和输出函数需要`#include
`。
| 函数 | 函数说明 |
| ----------------------- | ------------------------------------- |
| scanf() | 从标准输入流 stdin(键盘) 读取输入,需要格式控制。 |
| printf() | 把输出写入到标准输出流 stdout(屏幕) ,需要格式控制。 |
| int getchar(void) | 读取一个可用的字符,并把它返回为一个整数。 |
| int putchar(int c) | 把字符输出到屏幕上,并返回相同的字符。 |
| char *gets(char *s) | 从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。 |
| int puts(const char *s) | 把字符串 s 和一个尾随的换行符写入到 stdout。 |
在C语言中,输出通常使用printf(),读取单个字符通常使用getchar()(常与putchar()配合使用),读取字符串通常使用gets()(因为scanf()无法读取空格使用起来不方便),读取数字(包括整数与小数)则使用scanf()。
### 2.字符串处理函数
使用字符串处理函数需要`#include
`,假设s和t是char *类型,cs和ct是const char *类型,n的类型为int。
| 函数 | 函数说明 |
| --------------------------------------------- | --------------------------------------------------------------------------- |
| char *strcpy(s, ct) | 字符串ct被复制到字符串s,包括终止空字符,返回值是s。 |
| char *strncpy(s, ct, n) | 从字符串ct复制最多n个字符到字符串s,返回值是s。 |
| char *strcat(s, ct) | 字符串ct被附加(连接)到字符串s,返回值是s。 |
| char *strncat(s, ct, n) | 从字符串ct最多附加(连接)n个字符到字符串s,返回值是s。 |
| int strcmp(cs, ct) | 将字符串cs与字符串ct进行比较。如果cs < ct,则返回值为负,如果cs==ct,则返回值为零,如果cs > ct,则返回值为正。 |
| int strcmp(cs, ct, n) | 将字符串ct中最多n个字符与字符串cs进行比较。如果cs < ct,则返回值为负,如果cs==ct,则返回值为零,如果cs > ct,则返回值为正。 |
| char *strchr(cs, c) | 搜索字符串cs以查找c的出现。返回值是指向cs中第一次出现c的位置的指针,如果在cs中找不到c,则返回NULL值。 |
| char *strrchr(cs, c) | 搜索字符串cs以查找c的出现。返回值是指向cs中最后一次出现c的位置的指针,如果在cs中找不到c,则返回NULL值。 |
| int strspn(cs, ct) | 搜索字符串cs以查找字符串ct中不存在的任何字符。返回值是cs中第一个不在ct中的字符的索引。 |
| int strcspn(cs, ct) | 搜索字符串cs以查找字符串ct中任何字符的出现。返回值是cs中第一个也可以在ct中找到的字符的索引。 |
| char *strpbrk(cs, ct) | 搜索字符串cs以查找字符串ct中任何字符的出现。返回值是指向cs中第一次出现ct字符的位置的指针,如果在cs中找不到ct字符,则返回NULL。 |
| char *strstr(cs, ct) | 搜索字符串cs以查找字符串ct的出现。返回值是指向cs中第一次出现ct的位置的指针,如果在cs中找不到ct,则返回NULL。 |
| int strlen(cs) | 计算字符串cs的长度并返回。 |
| void *memset(void *s, int ch, n) | 初始化函数,将s中当前位置后面的n个字节用 ch 替换,是对大数组进行清零操作的最快方法 。 |
| void *memcpy(void *str1, const void *str2, n) | 从str2所指的内存地址的起始位置开始拷贝n个字节到目标str1所指的内存地址的起始位置中。memcpy可以复制任意内容,例如字符串、数组、结构体等。 |
### 3.字符处理函数
使用字符处理函数需要`#include
`,字符处理函数的参数为int,函数的返回值也是int,如果满足条件则函数返回非零值,否则返回零。
| 函数 | 函数说明 |
| --------------- | -------------------------------- |
| isupper(ch) | 测试ch是否代表大写字母 |
| islower(ch) | 测试ch是否代表小写字母 |
| isalpha(ch) | 测试ch是否代表大写或者小写字母 |
| isdigit(ch) | 测试ch是否代表十进制数字 |
| isalnum(ch) | 测试ch是否代表大写字母、小写字母或者十进制数字 |
| iscntrl(ch) | 测试ch是否代表控制字符,ASCII值为0到31的字符为控制字符 |
| isgraph(ch) | 测试ch是否代表除空格外的打印字符 |
| isprint(ch) | 测试ch是否代表包括空格的打印字符 |
| ispunct(ch) | 测试ch是否代表空格、字母或数字之外的打印字符 |
| isspace(ch) | 测试ch是否代表空格、换页、换行、回车、制表符或者垂直制表符 |
| isxdigit(ch) | 测试ch是否代表十六进制数字 |
| int tolower(ch) | 如果ch代表大写字母,则转换为小写字母,否则返回时不做任何更改 |
| int toupper(ch) | 如果ch代表小写字母,则转换为大写字母,否则返回时不做任何更改 |
### 4.数学函数
使用数学函数需要`#include
`和`#include
`,假设u和v是求值为double类型常量的表达式。所有这些函数的返回类型都是double,角度的单位是弧度。
| 函数 | 函数说明 |
| ----------- | ----------------------------------------------------------------------------- |
| sin(u) | 计算u的正弦并返回。这里u是弧度表示的角度。 |
| cos(u) | 计算u的余弦并返回。这里u是弧度表示的角度。 |
| tan(u) | 计算u的正切并返回。这里u是弧度表示的角度。 |
| asin(u) | 计算u的反正弦并返回。这里u是-1.0和+1.0之间的正弦值。返回值是-Π/2和+Π/2弧度之间的角度。如果检测到域错误(参数超出范围),则返回值0.0。 |
| acos(u) | 计算u的反余弦并返回。这里u是-1.0和+1.0之间的余弦值。返回值是0和Π弧度之间的角度。如果检测到域错误,则返回值0.0。 |
| atan(u) | 计算u的反正切并返回。这里u是有符号切线值。返回值是-Π/2和+Π/2弧度之间的角度。 |
| atan2(u, v) | 计算u/v的反正切并返回。这里u和v代表任何带符号的值。返回值是-Π和+Π弧度之间的角度,其正切值为u/v。 |
| sinh(u) | 计算u的双曲正弦并返回。这里u是弧度表示的角度。如果发生溢出,则返回±(HUGE_VAL)的值。 |
| cosh(u) | 计算u的双曲余弦并返回。这里u是弧度表示的角度。如果发生溢出,则返回±(HUGE_VAL)的值。 |
| tanh(u) | 计算u的双曲正切并返回。这里u是弧度表示的角度。如果发生溢出,则返回±(HUGE_VAL)的值。 |
| exp(u) | 计算e的u次幂,其中e=2.7182818。如果发生下溢,则返回值0.0。如果发生溢出,则返回值HUGE_VAL。 |
| log(u) | 计算u的自然对数。这里u表示正浮点数,如果参数u为零或负数,则返回值-(HUGE_VAL)。 |
| log10(u) | 计算u的以10为底的对数。这里u表示正浮点数,如果参数u为零或负数,则返回值-(HUGE_VAL)。 |
| pow(u, v) | 计算u的v次幂。如果u==0且v<=0,或者如果u<0且v不是整数,则会发生域错误。如果发生溢出,则返回±(HUGE_VAL)的值。 |
| sqrt(u) | 计算u的平方根。这里u是非负数,如果u是负数,则返回零。 |
| ceil(u) | 计算大于或等于u的最小整数。 |
| floor(u) | 计算小于或等于u的最大整数。 |
| fabs(u) | 计算u的绝对值。 |
| fmod(u, v) | 计算u/v的余数,如果v为0.0,则返回值也为0.0。 |
### 5.实用程序函数
使用实用程序函数需要`#include
`。
| 函数 | 函数说明 |
| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| double atof(const char *str) | 将字符串str转换为double类型的数字并返回。例如,字符串"1.234"将转换为数字1.234,然后返回此数字。 |
| int atoi(const char *str) | 将字符串str转换为int类型的数字并返回。例如,字符串"1234"将转换为数字1234,然后返回此数字。 |
| long atol(const char *str) | 将字符串str转换为long类型的数字并返回。例如,字符串"1234"将转换为数字1234,然后返回此数字。 |
| int rand(void) | 返回0到RAND_MAX范围内的伪随机整数。 |
| void srand(unsigned int seed) | 利用seed(一个整数)作为种子,用于通过函数rand()生成新的随机数。 |
| void abort(void) | 导致程序异常终止。 |
| void exit(int status) | 导致程序正常终止。给此函数传递整数status以指示程序的状态。例如,传递整数0以指示程序的成功终止。预定义的常量EXIT_SUCCESS和EXIT_FAILURE也传递给该函数,分别表示程序的成功和失败。 |
| int abs(int num) | 返回int参数num的绝对值。 |
| long abs(long num) | 返回long参数num的绝对值。 |
| void qsort(void *base, size_t nitems, size_t size, int (*compar)()) | 数组排序函数。base-指向要排序的数组的第一个元素的指针。nitems-由 base 指向的数组中元素的个数。size-数组中每个元素的大小,以字节为单位。compar-用来比较两个元素的函数,通过此函数来实现不同方式的排序。 |
### 6.内存管理函数
使用内存管理函数需要`#include
`。
| 函数 | 函数说明 |
| ----------------------------------------- | ---------------------------------------------------------------------------------------- |
| void *calloc(int num, int size) | 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。 |
| void *malloc(int num) | 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。 |
| void *realloc(void *address, int newsize) | 该函数重新分配内存,把内存扩展到 newsize。 |
| void free(void *address) | 该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。 |