首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01|快速回顾:一个 C 程序的完整生命周期
02|程序基石:数据与量值是如何被组织的?
03|计算单元:运算符是如何工作的?
04|控制逻辑:表达式和语句是如何协调程序运行的?
05|代码封装:函数是如何被调用的?
06|整合数据:枚举、结构与联合是如何实现的?
07|操控资源:指针是如何灵活使用内存的?
08|编译准备:预处理器是怎样处理程序代码的?
09|标准库:字符、字符串处理与数学计算
10|标准库:深入理解标准 IO
11|标准库:非本地跳转与可变参数是怎样实现的?
12|标准库:你需要了解的 C 并发编程基础知识有哪些?
13|标准库:如何使用互斥量等技术协调线程运行?
14|标准库:信号与操作系统软中断有什么关系?
15|标准库:日期、时间与实用函数
16|标准库:断言、错误处理与对齐
17|极致优化:如何实现高性能的 C 程序?
18|生产加速:C 项目需要考虑的编码规范有哪些?
19|生产加速:如何使用自动化测试确保 C 项目质量?
20|生产加速:如何使用结构化编译加速 C 项目构建?
21|实战项目:一个简单的高性能 HTTP Server
22|可执行二进制文件里有什么?
23|进程是如何使用操作系统内存的?
24|编译器在链接程序时发生了什么?
25|程序可以在运行时进行链接吗?
26|C 程序的入口真的是 main 函数吗?
27|ABI 与 API 究竟有什么区别?
28|程序如何与操作系统交互?
当前位置:
首页>>
技术小册>>
深入C语言和程序运行原理
小册名称:深入C语言和程序运行原理
### 09|标准库:字符、字符串处理与数学计算 在C语言的世界里,标准库(Standard Library)是程序员手中的一把强大武器,它不仅提供了一系列基础的数据类型,还封装了众多用于字符处理、字符串操作以及数学计算的函数,极大地简化了编程任务,提高了代码的可读性和可维护性。本章将深入探讨C语言标准库中与字符、字符串处理及数学计算相关的部分,帮助读者掌握这些基础而又强大的工具。 #### 9.1 字符处理 字符处理是编程中的基础任务之一,C语言标准库提供了多个函数用于字符的输入输出、转换和分类。 ##### 9.1.1 字符输入输出 - **`putchar(int char)`**:该函数用于输出单个字符到标准输出设备(通常是屏幕)。尽管其参数类型为`int`,但实际上是按照`unsigned char`被转换并输出。若参数是EOF(文件结束符),则不进行任何输出。 - **`getchar(void)`**:从标准输入设备(通常是键盘)读取下一个可用的字符,并返回它作为`unsigned char`类型被转换为`int`的结果。如果读取失败或到达文件末尾,则返回EOF。 ##### 9.1.2 字符转换 - **`tolower(int c)`** 和 **`toupper(int c)`**:这两个函数分别用于将大写字母转换为小写字母,或将小写字母转换为大写字母。如果输入字符不是字母,则函数返回该字符本身。 - **`isalpha(int c)`**、**`isdigit(int c)`**、**`islower(int c)`**、**`isupper(int c)`** 等:这一系列函数用于检查传入的字符是否属于特定的分类,如字母、数字、小写字母、大写字母等。它们返回非零值(真)或零(假)来表示结果。 #### 9.2 字符串处理 字符串是C语言中用于表示文本数据的基本方式,标准库提供了丰富的函数来操作字符串,包括复制、连接、比较、查找等。 ##### 9.2.1 字符串复制与连接 - **`strcpy(char *dest, const char *src)`**:将`src`指向的字符串(包括终止的空字符)复制到`dest`指向的数组中。注意,使用`strcpy`时需确保`dest`有足够的空间来存放复制的字符串,以避免缓冲区溢出。 - **`strcat(char *dest, const char *src)`**:将`src`指向的字符串连接到`dest`指向的字符串的末尾,并包括`src`的终止空字符。同样,使用前需确保`dest`有足够的空间。 ##### 9.2.2 字符串比较 - **`strcmp(const char *s1, const char *s2)`**:比较两个字符串`s1`和`s2`。如果`s1`和`s2`字符串相等,则返回0;如果`s1`在字典序上小于`s2`,则返回负值;如果`s1`大于`s2`,则返回正值。 - **`strncmp(const char *s1, const char *s2, size_t n)`**:与`strcmp`类似,但只比较前`n`个字符。 ##### 9.2.3 字符串查找与替换 - **`strchr(const char *s, int c)`**:在字符串`s`中查找第一次出现的字符`c`,并返回指向该字符的指针。如果未找到,则返回NULL。 - **`strstr(const char *haystack, const char *needle)`**:在字符串`haystack`中查找第一次出现的子串`needle`,并返回指向该子串的起始位置的指针。如果未找到,则返回NULL。 - 标准库不直接提供字符串替换的函数,但可以通过组合使用字符串查找、复制和连接等函数来实现。 ##### 9.2.4 字符串长度与内存操作 - **`strlen(const char *s)`**:计算并返回字符串`s`的长度,不包括终止的空字符。 - **`memcpy(void *dest, const void *src, size_t n)`** 和 **`memmove(void *dest, const void *src, size_t n)`**:这两个函数用于从`src`指向的内存位置复制`n`个字节到`dest`指向的内存位置。`memcpy`假设源区域和目标区域不重叠,而`memmove`则没有这一限制,因此更加安全但可能效率稍低。 - **`memset(void *s, int c, size_t n)`**:将`s`指向的内存区域的前`n`个字节设置为字符`c`的ASCII值。`c`通常被转换为`unsigned char`类型。 #### 9.3 数学计算 C语言标准库中的数学库(`<math.h>`)提供了大量的数学函数,用于执行各种数值计算任务。 ##### 9.3.1 基本数学函数 - **`sqrt(double x)`**:计算并返回`x`的非负平方根。 - **`pow(double base, double exponent)`**:计算`base`的`exponent`次幂。 - **`fabs(double x)`**:计算并返回`x`的绝对值。 - **`ceil(double x)`** 和 **`floor(double x)`**:分别返回不小于`x`的最小整数(向上取整)和不大于`x`的最大整数(向下取整)。 ##### 9.3.2 三角函数 - **`sin(double x)`**、**`cos(double x)`**、**`tan(double x)`**:分别计算角度`x`(以弧度为单位)的正弦、余弦和正切值。 - **`asin(double x)`**、**`acos(double x)`**、**`atan(double x)`**、**`atan2(double y, double x)`**:分别计算给定值`x`的正弦、余弦和正切的反函数值。`atan2`函数用于计算从`x`轴正方向到点`(x, y)`的向量与`x`轴之间的角度(以弧度为单位),考虑了所有四个象限。 ##### 9.3.3 浮点数的比较与分类 由于浮点数的表示方式,直接比较两个浮点数是否相等可能不总是可靠的。因此,标准库提供了`fequal(double x, double y, double epsilon)`这样的函数(注意:`fequal`并非标准C库函数,但概念相似),通过比较两数之差是否小于某个很小的正数`epsilon`来判断它们是否“足够接近”。 此外,`<math.h>`还提供了如`isnan(double x)`、`isfinite(double x)`、`isinf(double x)`等函数,用于检查浮点数的特殊状态,如非数字(NaN)、有限数和无穷大。 #### 9.4 实战应用 理论知识的掌握最终需通过实践来巩固。以下是一个简单的例子,展示了如何使用上述函数处理字符串和进行数学计算: ```c #include <stdio.h> #include <string.h> #include <math.h> int main() { char src[] = "Hello, World!"; char dest[50]; char *found; // 字符串复制 strcpy(dest, src); printf("Copied string: %s\n", dest); // 字符串查找 found = strstr(dest, "World"); if (found) { printf("Found 'World' at position %ld\n", found - dest); } // 数学计算 double base = 2.0, exponent = 3.0; double result = pow(base, exponent); printf("2.0 raised to the power of 3.0 is %f\n", result); // 浮点数比较(示例,非标准函数) if (fabs(result - 8.0) < 0.00001) { printf("The result is approximately 8.0\n"); } return 0; } ``` 本章详细介绍了C语言标准库中与字符、字符串处理及数学计算相关的函数,这些函数是C语言编程中不可或缺的工具。通过学习和实践这些函数,读者可以更加高效地处理文本数据和执行数值计算任务。
上一篇:
08|编译准备:预处理器是怎样处理程序代码的?
下一篇:
10|标准库:深入理解标准 IO
该分类下的相关小册推荐:
c++零基础入门