From 15c899a89f98fa07ed55244f0f081f17038203fe Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Thu, 13 Oct 2022 16:15:18 +0800 Subject: [PATCH] doc: update `docs/c.md`. --- docs/c.md | 489 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 489 insertions(+) diff --git a/docs/c.md b/docs/c.md index 4d6b8fd..3e3ba31 100644 --- a/docs/c.md +++ b/docs/c.md @@ -800,6 +800,495 @@ int main(void) { } ``` +函数 +---- + +### 函数声明和定义 + + +```c +int main() { + printf("Hello World!"); + return 0; +} +``` + +函数由两部分组成 + +```c +void myFunction() { // 声明 declaration + // 函数体(要执行的代码)(definition) +} +``` + +--- + +- `Declaration` 声明函数名称、返回类型和参数 _(如果有)_ +- `Definition` 函数体 _(要执行的代码)_ + +--- + +```c +// 函数声明 +void myFunction(); +// 主要方法 +int main() { + myFunction(); // --> 调用函数 + return 0; +} +void myFunction() {// 函数定义 + printf("晚上好!"); +} +``` + +### 调用函数 + +```c +// 创建函数 +void myFunction() { + printf("晚上好!"); +} +int main() { + myFunction(); // 调用函数 + myFunction(); // 可以被多次调用 + return 0; +} +// 输出 -> "晚上好!" +// 输出 -> "晚上好!" +``` + +### 函数参数 + +```c +void myFunction(char name[]) { + printf("Hello %s\n", name); +} +int main() { + myFunction("Liam"); + myFunction("Jenny"); + return 0; +} +// Hello Liam +// Hello Jenny +``` + +### 多个参数 + +```c +void myFunction(char name[], int age) { + printf("你好 %s 你 %d 岁了。\n",name,age); +} +int main() { + myFunction("Liam", 3); + myFunction("Jenny", 14); + return 0; +} +// 你好 Liam 你 3 岁了。 +// 你好 Jenny 你 14 岁了。 +``` + +### 返回值 + + +```c +int myFunction(int x) { + return 5 + x; +} + +int main() { + printf("结果: %d", myFunction(3)); + return 0; +} +// 输出 8 (5 + 3) +``` + +两个参数 + +```c +int myFunction(int x, int y) { + return x + y; +} + +int main() { + printf("结果: %d", myFunction(5, 3)); + // 将结果存储在变量中 + int result = myFunction(5, 3); + printf("结果 = %d", result); + return 0; +} +// 结果: 8 (5 + 3) +// 结果 = 8 (5 + 3) +``` + +### 递归示例 + +```c +int sum(int k); +int main() { + int result = sum(10); + printf("%d", result); + return 0; +} + +int sum(int k) { + if (k > 0) { + return k + sum(k - 1); + } else { + return 0; + } +} +``` + +### 数学函数 + +```c +#include +printf("%f", sqrt(16)); // 平方根 +printf("%f", ceil(1.4)); // 四舍五入 (入) +printf("%f", floor(1.4)); // 四舍五入 (舍) +printf("%f", pow(4, 3)); // x(4)的y(3)次方 +``` + +--- + +- `abs(x)` 绝对值 +- `acos(x)` 反余弦值 +- `asin(x)` 反正弦值 +- `atan(x)` 反正切 +- `cbrt(x)` 立方根 +- `cos(x)` 余弦 +- `exp(x)` Ex 的值 +- `sin(x)` x 的正弦值 +- `tan(x)` 角度的正切 + + +Structures 结构 +--- + +### 创建结构 + +```c +struct MyStructure { // 结构声明 + int myNum; // 成员(int 变量) + char myLetter; // 成员(char 变量) +}; // 用分号结束结构 +``` + +创建一个名为 `s1` 的结构变量 + +```c {7} +struct myStructure { + int myNum; + char myLetter; +}; + +int main() { + struct myStructure s1; + return 0; +} +``` + +### 结构中的字符串 + +```c {9} +struct myStructure { + int myNum; + char myLetter; + char myString[30]; // String +}; + +int main() { + struct myStructure s1; + strcpy(s1.myString, "Some text"); + // 打印值 + printf("我字符串: %s", s1.myString); + return 0; +} +``` + +使用 `strcpy` 函数为字符串赋值 + +### 访问结构成员 + + +```c {11,12,16} +// 创建一个名为 myStructure 的结构 +struct myStructure { + int myNum; + char myLetter; +}; + +int main() { + // 创建一个名为 s1 的 myStructure 结构变量 + struct myStructure s1; + // 为 s1 的成员赋值 + s1.myNum = 13; + s1.myLetter = 'B'; + + // 创建一个名为 s2 的 myStructure 结构变量 + // 并为其赋值 + struct myStructure s2 = {13, 'B'}; + // 打印值 + printf("My number: %d\n", s1.myNum); + printf("My letter: %c\n", s1.myLetter); + return 0; +} +``` + +创建不同的结构变量 + +```c +struct myStructure s1; +struct myStructure s2; +// 为不同的结构变量赋值 +s1.myNum = 13; +s1.myLetter = 'B'; + +s2.myNum = 20; +s2.myLetter = 'C'; +``` + +### 复制结构 + +```c {6} +struct myStructure s1 = { + 13, 'B', "Some text" +}; + +struct myStructure s2; +s2 = s1; +``` + +示例中,将 `s1` 的值复制到 `s2` + +### 修改值 + +```c +// 创建一个结构变量并为其赋值 +struct myStructure s1 = { + 13, 'B' +}; +// 修改值 +s1.myNum = 30; +s1.myLetter = 'C'; +// 打印值 +printf("%d %c %s", + s1.myNum, + s1.myLetter); +``` + +文件处理 +--- + +### 文件处理函数 + +函数 | 描述 Description +---- | ---- +`fopen()` | `打开`新文件或现有文件 +`fprintf()` | 将数据`写入`文件 +`fscanf()` | 从文件中`读取`数据 +`fputc()` | 将一个字符`写入`文件 +`fgetc()` | 从文件中`读取`一个字符 +`fclose()` | `关闭`文件 +`fseek()` | 将文件指针设置到`给定位置` +`fputw()` | 将整数`写入`文件 +`fgetw()` | 从文件中`读取`一个整数 +`ftell()` | 返回当前`位置` +`rewind()` | 将文件指针设置为文件的开头 + +C 库中有许多函数可以`打开`/`读取`/`写入`/`搜索`和`关闭`文件 + +### 打开模式参数 + +模式 Mode | 描述 Description +---- | ---- +`r` | 以`读取`模式打开一个文本文件,允许读取文件 +`w` | 以`写`模式打开一个文本文件,允许写入文件 +`a` | 以`追加`模式打开一个文本文件
如果文件不存在,则会创建一个新文件 +`r+` | 以`读写`模式打开一个文本文件,允许读写文件 +`w+` | 以`读写`模式打开一个文本文件,允许读写文件 +`a+` | 以`读写`模式打开一个文本文件,允许读写文件 +`rb` | 以`读取`模式打开二进制文件 +`wb` | 以`写入`模式打开二进制文件 +`ab` | 以`追加`模式打开二进制文件 +`rb+` | 以`读写`模式打开二进制文件 +`wb+` | 以`读写`模式打开二进制文件 +`ab+` | 以`读写`模式打开二进制文件 + +### 打开文件:fopen() + +```c +#include +void main( ) { + FILE *fp; + char ch; + fp = fopen("file_handle.c", "r"); + while (1) { + ch = fgetc(fp); + if (ch == EOF) + break; + printf("%c", ch); + } + fclose(fp); +} +``` + +对文件执行所有操作后,必须关闭 `fclose()` 该文件 + +### 写入文件:fprintf() + +```c +#include +main() { + FILE *fp; + fp = fopen("file.txt", "w"); // 打开文件 + fprintf(fp, "Hello file by fprintf...\n"); // 将数据写入文件 + fclose(fp); // 关闭文件 +} +``` + +### 读取文件:fscanf() + + +```c +#include +main(){ + FILE *fp; + char buff[255]; // 创建 char 数组来存储文件数据 + fp = fopen("file.txt", "r"); + while(fscanf(fp, "%s", buff)!=EOF) { + printf("%s ", buff); + } + fclose(fp); +} +``` + +### 写入文件:fputc() + +```c +#include +main(){ + FILE *fp; + fp = fopen("file1.txt", "w"); // 打开文件 + fputc('a',fp); // 将单个字符写入文件 + fclose(fp); // 关闭文件 +} +``` + +### 读取文件:fgetc() + +```c +#include +#include +void main() { + FILE *fp; + char c; + clrscr(); + fp=fopen("myfile.txt", "r"); + while((c=fgetc(fp))!=EOF){ + printf("%c", c); + } + fclose(fp); + getch(); +} +``` + +### 写入文件:fputs() + +```c +#include +#include +void main(){ + FILE *fp; + clrscr(); + fp = fopen("myfile2.txt","w"); + fputs("hello c programming",fp); + fclose(fp); + getch(); +} +``` + +### 读取文件:fgets() + + +```c +#include +#include +void main() { + FILE *fp; + char text[300]; + clrscr(); + + fp=fopen("myfile2.txt", "r"); + printf("%s", fgets(text, 200, fp)); + fclose(fp); + getch(); +} +``` + +### fseek() + +```c +#include +void main(){ + FILE *fp; + fp = fopen("myfile.txt","w+"); + fputs("This is Book", fp); + + fseek(fp, 7, SEEK_SET); + fputs("Kenny Wong", fp); + fclose(fp); +} +``` + +将文件指针设置到给定位置 + +### rewind() + +```c +#include +#include +void main(){ + FILE *fp; + char c; + clrscr(); + fp=fopen("file.txt", "r"); + while((c=fgetc(fp)) != EOF){ + printf("%c", c); + } + rewind(fp); // 将文件指针移动到文件的开头 + while((c=fgetc(fp)) != EOF){ + printf("%c", c); + } + fclose(fp); + getch(); +} +// 输出 +// Hello World!Hello World! +``` + +### ftell() + +```c +#include +#include +void main (){ + FILE *fp; + int length; + clrscr(); + fp = fopen("file.txt", "r"); + fseek(fp, 0, SEEK_END); + + length = ftell(fp); + + fclose(fp); + printf("文件大小: %d bytes", length); + getch(); +} +// 输出 +// 文件大小: 18 bytes +``` + 另见 ---