深入 C 语言和程序运行原理
于航
PayPal 技术专家
21121 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
深入 C 语言和程序运行原理
15
15
1.0x
00:00/00:00
登录|注册

10|标准库:字符、字符串处理与数学计算

指针形式:引用 .rodata 中的数据
数组形式:复制数据到栈内存
数组形式:const char strA[] = "Hello, geek!";
指针形式:const char* str = "Hello, geek!";
字符串定义方式的影响
内存布局:带有终止符 \0 的字符数组
字符串字面量:连续字符串字面量视为一个整体
定义方式
宽字符类型:wchar_t, char16_t, char32_t
编码:ASCII 编码映射
字节大小:sizeof(char) 永远为 1
符号性:由编译器和平台决定
定义方式:单引号 'a'
实现不修改源字符串的 strtok 版本
strtok 函数的实现和引起 "Segmentation fault" 的原因
C 标准库中数学运算函数的使用和特性
C 标准库中字符、字符串处理函数的使用
字符和字符串的定义及其影响
数学函数特性:某些函数映射到机器指令
泛型宏函数:tgmath.h
头文件:math.h, stdlib.h
字符的判断与转换:ctype.h 中的函数
格式化字符串:sprintf
拷贝字符串:strncpy
拼接字符串:strncat
统计字符串长度:strlen
字符串
字符
思考题
总结
C 标准库中的数学运算
C 标准库中的字符、字符串处理
C 语言中的字符和字符串
C 语言字符、字符串处理与数学计算

该思维导图由 AI 生成,仅供参考

你好,我是于航。从这一讲开始,我们将进入到 C 工程实战篇的学习。
在上一个模块中,我主要围绕着 C 语言的七大关键语法,介绍了它们在机器指令层面的实现细节。而接下来,走出语法,从微观到宏观,我们将开始进一步探索 C 语法之外,那些可以用来支撑大型 C 项目构建的特性和技术。
因此,在这一模块中,我会介绍和 C 语言标准库、工程化,以及性能优化等相关的内容。C 标准库是除 C 基本核心语法外,C 语言的另一个重要组成部分。C 标准库中提供了众多的类型、函数和宏,可供我们直接在程序中使用。这些“构建单元”的功能涵盖了多个方面,从简单的文本字符处理,到复杂的线程操作、内存管理等。在继续后面的内容之前,你可以先粗略浏览下图,以对 C 标准库提供的基本功能有个大致的印象。
今天,我们就先来看看 C 标准库中与字符、字符串处理,以及数学运算相关的内容。

C 语言中的字符和字符串

在 C 语言中,字符用单引号表示,字符串用双引号表示。比如在下面这段代码中便定义有两个变量,它们分别存放了一个字符类型和一个字符串类型的值。
char c = 'a';
const char* str = "Hello, geek!";
下面,我们就来分别看看与这两种类型有关的重要特性。

字符

在 C 语言标准中,不同于其他整数类型(比如 int),字符类型 char 并没有被规定默认的符号性,而其具体符号性则是由编译器和所在平台决定的。虽然在大多数情况下,编译器会选择将默认情况下的 char 类型视为有符号整数类型,但考虑到程序的可用性与可移植性,在实际编码中还是建议显式指定出所定义字符变量的符号性
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文主要介绍了C语言中的字符、字符串处理与数学计算相关内容。首先讨论了C标准库的重要性,包括字符、字符串处理和数学运算等多个方面。文章详细介绍了C语言中字符的特性,包括字符类型char的符号性、大小以及ASCII编码的使用,还介绍了C90和C11标准中新增的宽字符类型。此外,文章讨论了字符串在C语言中的定义方式以及在内存中的布局形式,并介绍了C标准库中的字符、字符串处理函数的使用方法,包括统计字符串长度、拼接字符串、拷贝字符串和格式化字符串等。另外,还提到了C标准库头文件ctype.h中包含的字符判断和转换函数。此外,文章还介绍了C标准库中与数学运算相关的函数,包括math.h头文件中包含的精确类型版本和tgmath.h头文件中提供的泛型宏函数版本。最后,文章提到了一些常用的数学运算会被直接映射到对应的机器指令,以获得更高的性能。文章内容深入浅出,为读者提供了深入了解C语言技术特点的入门指南。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • ppd0705
    置顶
    看了半天也没看懂 tgmath.h 怎么实现泛型的,有大佬帮忙指点一二吗?

    作者回复: 可以尝试看看 musl 中的实现:http://git.musl-libc.org/cgit/musl/tree/include/tgmath.h

    2022-03-13
    2
  • zxk
    如果把 strncpy 函数中第三个参数使用的 strlen 函数更换成 sizeof,那么程序运行会得到什么结果?为什么? 会得到 14 个连续的 b。这是由于 sizeof 得到的长度为 7,会导致 strA 的终止符被替换成 b,后面再次读取 strA 的时候由于无法识别到终止符,会继续读取,直到读取到 strB 的终止符才结束。两个字符串加起来就是 14 个 b。

    作者回复: 回答正确!

    2022-02-01
    5
    6
  • Ping
    老师能不能介绍一下musl这个库的特点和用途?

    作者回复: musl 其实跟我们常用的 glibc(GNU C Library)类似,两者同属于 C 标准库(libc)的一种实现。只是相对来说,glibc 实现较为臃肿,健壮性稍差,存在的潜在漏洞也多。但是实现的功能众多(有很多 C 标准以外的),且使用也很广泛。而 musl 则旨在提供一个轻量级的、ABI 稳定的、且适用于移动设备和嵌入式系统的 libc 实现。它支持的功能上则对标 C 标准。

    2021-12-29
    3
  • 白花风信子
    学到好多细节!不过老师会在后面再深入提提elf文件是怎么加载的嘛qwq。

    作者回复: 会的哈,我们会在下一个模块中介绍的。

    2021-12-29
    3
  • ppm
    怎么没有snprintf的例子

    作者回复: 嗯,查了一下才发现 snprintf 比 sprintf 函数更安全一些。新知识很到位!

    2021-12-29
    1
  • serika
    为什么我 pgrep string | xargs -I {} cat /proc/{}/maps 这条指令打印不出来任何信息呀。 虽然第二条指令可以生效,也可以看见字符串的内容,但是地址却和程序本身打印的不一样。 这是有什么地址保护的机制吗。 我的环境是 ubuntu22 ,gcc 的版本是 11.3.0 。

    作者回复: 可以先看看前半部分命令 “pgrep string” 打印的内容是什么。

    2022-12-04归属地:湖北
  • fei
    pgrep string | xargs -I {} cat /proc/{}/maps 这条命令执行时,string进程老早退出了。这个实验要怎么来做呢?

    作者回复: 是在什么系统上测试的?

    2022-08-05归属地:浙江
    2
  • 徐雅清
    为什么我在线编译,isalpha(c)的结果是1024呢,复制的老师的代码

    作者回复: 很好的问题!需要注意的是,实际上包括 isalpha 在内的一系列字符判断函数,它们的行为是在满足函数格式要求的情况下返回“非零值”,否则返回 0。而这里的非零值具体是多少则视不同的编译器而定。

    2022-06-12
  • 龍蝦
    而使用数组形式定义的字符串 strA ,则是将该字符串的数据从 .rodata 中复制到了其他地方,strA 的值为复制后该字符串第一个字符的所在地址。 老师,数组形式定义,应该是在栈上直接定义局部变量吧? #include <stdio.h> int main(void) { const char strA[] = "a"; const char* strB = "a"; return 0; } .LC0: .string "a" main: push rbp mov rbp, rsp mov WORD PTR [rbp-10], 97 mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0 mov eax, 0 pop rbp ret

    作者回复: “数组形式定义,应该是在栈上直接定义局部变量吧?”是的哈。我们这里文中提到的“复制”是指对同样的这段数据,编译器会通过其他的方式使用,并不是说在机器指令层面有复制的过程。

    2022-03-02
  • shk1230
    什么叫泛型宏?

    作者回复: 这里实际上就是对 tgmath.h 中的这些支持泛型参数的宏函数简称哈。

    2022-02-26
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部