c - 字符串的“character”是什么?

标签 c language-lawyer

C11将“字符串”定义为:

字符串是由和终止的连续字符序列
包括第一个空字符。 §7.1.11

先前将“字符”定义为:

3.7 字符
〈抽象〉一组元素的成员,用于组织,控制或表示数据

3.7.1
字符
单字节字符
〈C〉适合一个字节的位表示

3.7.2
多字节字符
表示扩展字符集成员的一个或多个字节的序列...

3.7.3
宽字符
可以表示任何字符的wchar_t类型的对象表示的值
在当前语言环境中

问题:在“字符串”的定义中使用了什么“字符”定义:
3.7中的“字符”,
3.7.1中的“字符”,
或者是其他东西?

最佳答案

字符串是char类型的连续数据序列。
“字符”一词有两种含义,即抽象的和实用的。
从抽象的角度来看,我们首先必须定义“字符集”概念,以便随后转到3.7,并说“...的一组元素的成员”。
此“字符”定义符合另一个标准:ISO / IEC 2382-1。

参见ISO/IEC 2382-1(character)

在这里,您可以分析与“信息表示”相关的大量术语。

我的简短回答:“string”定义中的“character”对应于c11.3.7.1。
解释如下:

摘要中的字符

符号是人类的智力习俗。
因此,“A”的抽象符号是一种约定,我们习惯于将诸如A,,A之类的不同“图形”识别为全部“相同”的事物(例如一条信息)。
然后,该信息由一组(抽象)字符的有序和有限序列表示。
接下来,您需要对这些抽象符号进行整理,以使其在信息系统(计算机)中具有代表性。
通常,这是通过在给定集中定义整数(称为代码点)与其对应字符之间的一一对应关系来完成的。
编码模式是一种将一组字符与某些数字(代码点)相关联的方法。
此编码可以从一个系统更改为另一个系统(EBCDIC中的“A”编码与ASCII中的编码不同)。
最后,我们将一个“图形”关联到每个字符+代码点,即一个书面表示形式,可以最终在屏幕上打印或显示该图形。
图形的形状可以根据字体设计而变化,因此定义术语“字符”不是一个好的起点。

CHARACTER IN C

在3.7.1中。似乎C11指的是“字符”的另一种含义,旨在以简短形式表示“单字节字符”。它是指恰好适合1个字节的代码点(即与“给定集合的抽象字符”相关联的整数)。
在这种情况下,我们需要定义字节
在C语言中,一个字节是信息存储单元,由n位有序序列组成,其中n是一个大于或等于8的整数(通常为8),您可以通过以下方式找到其值:检查CHAR_BIT中的常量<limits.h>

有些数据类型的大小恰好为1个字节:char, unsigned char, signed charunsigned char的值范围正好是0 ... 2 ^ n-1,其中n是CHAR_BITchar的值范围与signed charunsgined char一致,但C11并未说明其中哪一个与char相对应。
而且,在任何情况下,都必须将char类型与signed charunsigned char视为不同。

现在,字符串是char类型的对象序列。

为什么使用CHAR?

该标准使用char定义了字符的表示形式:

(6.2.5.3)

声明为char类型的对象足够大,可以存储基本类型的任何成员
执行字符集。如果基本执行字符集的成员存储在
char对象,其值保证为非负数。如果其他任何字符存储在
一个char对象,结果值由实现定义,但应在范围内
可以用该类型表示的值。

STRING

现在,C中的字符串是由空字符终止的(单字节)字符的连续序列,在C中始终为0。
可以以抽象的方式再次理解该定义,但是在7.1.1.1中,文本讨论了字符串的地址,因此必须理解“字符串”是内存中的对象。
因此,“字符串”对象是连续的“字节”序列,每个字节都包含一个字符的代码点。

这源于一个事实,即“字符”旨在恰好适合1个字节。
用C表示类型为char的数组,其最后一个元素为0。

MULTIBYTE CHARACTER

“多字节”的定义很复杂。
它被称为某些特殊的编码模式,该模式使用可变数量的字节来表示(抽象)字符。
您需要有关执行字符集的信息,以便正确处理多字节字符集。
但是,即使您具有多字节字符,它在内存中仍会以字节序列的形式表示。

这意味着您将再次将一个多字节字符串表示为array of char
执行系统解释这些字节的方式是一个不同的问题。

宽字符

宽字符是另一组(抽象)字符的元素,与char类型表示的字符不同。
旨在使“宽字符”的集合大于“单字节字符”的集合。
但这并非一定如此。

“宽字符”的相关事实如下:

  • 可以用wchar_t类型的值范围表示“宽字符”集,无论它们是什么。
  • 这些字符可以与char类型表示的字符不同。
  • “宽字符”可以使用1个以上的字节存储空间。
  • “宽字符串”是一个以空终止的连续序列的“宽字符”。

  • 因此,“宽字符串”是与“字符串”不同的对象。

    结论

    字符串与“宽”字符无关,而仅与“单字节字符”有关。
    字符串是一个以空字符结尾的连续连续的“字节”序列,依次表示某些char类型的对象:char, signed char, unsigned char,对应于适合1个字节的抽象字符集的代码点。

    关于c - 字符串的“character”是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214724/

    相关文章:

    c++ - "bind directly"在引用初始化中是什么意思?

    c++ - 模板特化静态初始化 icc+vc vs gcc+clang

    C - 我可以从 char * 创建一个 const char * 变量吗?

    c - 我的排序程序出错

    c++ - SVNKit 类似于 C 或 C++ 的包装器

    c++ - 最佳可行的转换函数

    c++ - 是否可以反序列化(从原始内存块)没有默认构造函数的对象?

    c++ - std::thread::join是否保证写入可见性

    c++ - 从 WAV 文件中获取实际值 C++

    c - 将弹出菜单放置在小部件 GTK 下方