Skip to content

换个姿势学C语言

0. 说明

《换个姿势学C语言》由何旭辉 著,清华大学出版社2022年出版。感谢何老师!

Snipaste_2024-03-10_14-51-10.png

这是一本非常不错的书!

5. 获取完整的牌价数据

5.3 字符和字符串

在5.1.2节中,我们已经可以使用一个双精度浮点型数组存储现汇买入价、现钞买入价、现汇卖出价、现钞卖出价和中行折算价。

Snipaste_2024-03-10_00-12-26.png

对于文字,很多语言提供了“字符串”这种数据类型。

  • 字符串可用于存储多个连续的字符。

  • 你在在阅读的教程文本、人名、要显示的货币名称等都是字符串。

  • 字符串中的字符可以是汉字、字母、数字、符号或者其他国家的文字符号。

  • C语言并没有提供“字符串”这种数据类型。

deepseek的回答:

在C语言中,没有直接提供“字符串”数据类型,而是通过字符数组和字符指针来处理字符串。这种设计有以下几个原因:

  1. 历史原因 C语言诞生于20世纪70年代,设计初衷是用于系统编程,强调简洁和高效。当时的内存和处理能力有限,因此C语言选择了一种轻量级的方式处理字符串,即使用字符数组和指针。

  2. 灵活性 C语言的设计理念是提供底层控制,允许程序员直接操作内存。通过字符数组和指针,程序员可以灵活地管理字符串的内存分配、复制、拼接等操作,而不依赖于高级语言中的“黑箱”实现。

  3. 与硬件的紧密联系 C语言的设计目标是贴近硬件,字符数组和指针可以很好地映射到内存的连续地址空间。这种设计使得C语言在处理字符串时非常高效,适合系统编程和嵌入式开发。

  4. 简单性 C语言的核心语法非常简洁,没有引入复杂的字符串类型。通过字符数组和指针,C语言可以用最小的语法开销实现字符串操作。

  5. \0结尾的约定 C语言中的字符串以\0(空字符)作为结束标志,这种设计简单且高效。虽然需要程序员手动管理字符串的长度和内存,但也避免了额外的存储开销。

  6. 标准库支持 虽然C语言本身没有字符串类型,但标准库(如<string.h>)提供了丰富的字符串操作函数(如strcpystrlenstrcat等),弥补了语言本身的不足。

总结 C语言不提供字符串类型是为了保持语言的简洁性、灵活性和高效性。通过字符数组和指针,程序员可以完全控制字符串的内存和操作,虽然这增加了编程的复杂性,但也使得C语言在系统编程和底层开发中表现出色。

我们先来了解C语言中是如何处理字符和字符串的。

5.3.1 计算机中的字符

  • 严格意义上说,无论是中文使用的汉字还是英文中的字母都是一种图形,而计算机只能处理数值,准确地说是只能处理二进制数值。所有信息都必须转换成二进制的数值后才能被计算机处理。

例如字符“F”,要在屏幕上显示它就必须将这个字母的外观用二进制数值进行描述。方法之一就是把字符的外形划分成若干个栅格,然后分别用1和0来描述每个栅格的内容。

如下图所示就是字符F的点阵描述:

Snipaste_2025-05-14_22-32-31.png

可以看到,描述字母F的外观需要32个二进制位,也就是4个字节。但是文字是会重得使用的,如果每存储一个英文字符都要使用4个字节,在计算机技术发展的初期是不可接受的。

因此,在计算机系统中只停留一份用于显示的字符点阵信息(被称为字库或字模),然后给每个字符一个唯一的编号,在传输、存储字符时只使用字符的编号。换句话说,在存储大写字母F时不是存储它的点阵信息,而是存储一个数字编号来代表它(只须1个字节即可),这个编号被称为“字符编码”,到了要显示F的时候再根据这个编码从字库中调出它的点阵信息用于显示。

用数字代表文字不是计算机领域的发明,电报也是将文字转换成数字发出,接收方再根据双方一致的“密码本”将其翻译成文字。

  • 计算机中的字符编码必须采用公开。通用的编码标准。这样才能在不同类型的计算机之间交换信息。

5.3.2 字符编码

本首页参考 https://notes.fe-mm.com/ 配置而成