字符串定义中的“字符”是什么?

时间:2014-06-13 22:42:40

标签: c language-lawyer

C11将“字符串”定义为:

  

string 是由and结尾的连续字符序列   包括第一个空字符。 §7.1.11

它早先将“字符”定义为:

  

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

     

3.7.1   的字符
  单字节字符
  适合字节的位表示

     

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

     

3.7.3   广泛的性格
  值由wchar_t类型的对象表示,能够表示任何字符   在当前的区域设置

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

1 个答案:

答案 0 :(得分:3)

字符串是char类型的连续数据序列 单词"字符"用于两种意义,抽象和实用 从抽象的角度来看,我们首先必须定义概念"字符集",以便稍后转到3.7并说出#34;一组元素的成员。 ..&#34 ;.
这个"字符"的定义符合另一个标准:ISO / IEC 2382-1。

请参阅ISO/IEC 2382-1(character)

在那里,您可以分析与"信息表示"相关的大量术语列表。

我的简短回答:"字符"在"字符串"的定义中对应于c11.3.7.1。
解释如下:

摘要中的字符

符号是人类的知识分子 所以," A"的抽象符号;是一种惯例,我们用它来识别不同的图表"比如A, A A ,因为所有"相同"事情(一条信息,说)。
然后,通过一组(抽象)字符的有序和有限序列来表示信息 接下来,您需要对这些抽象符号进行编码,以使其在信息系统(计算机)中的表现成为可能 通常,这是通过定义整数(称为代码点)与给定集合中的对应字符之间的一对一对应来完成的。
编码架构是指一组字符与特定数字(代码点)相关联的方式。
此编码可以从一个系统更改为另一个系统(" A"在EBCDIC中的编码与ASCII中的编码不同)。
最后,我们将一个"图表"每个字符+代码点,即书面表示,最终可以打印或显示在屏幕上 图形的形状可以根据字体设计而改变,因此定义术语"字符"不是一个好的起点。

字符C

在3.7.1中。似乎C11指的是"字符"的另一个含义,意图是说"单字节字符"的简短形式。它讨论的是代码点(即与#34相关的整数;给定集合的抽象字符"),它们恰好适合1个字节。
在这种情况下,我们需要字节的定义 在C中,字节是信息存储单元,由 n 位的有序序列组成,其中 n 是大于或等于的整数等于8(当然一般是8),通过检查CHAR_BIT中的常量<limits.h>可以找到它的值。

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

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

为什么选择

标准根据char

定义字符的表示形式

(6.2.5.3)

  

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

STRING

现在,C中的字符串是一个连续的(单字节)字符序列,以空字符结尾,在C中始终为0。 这个定义可以用抽象的方式再次理解,但是在7.1.1.1中,文本讨论了字符串的地址,因此必须理解一个&#34;字符串&#34;是记忆中的一个对象 A&#34;字符串&#34;然后,对象是一个连续的&#34;字节&#34;的序列,每个字节都包含一个字符的代码点。

这是因为&#34;字符&#34;旨在完全适合1个字节 它在C中用类型char的数组表示,其最后一个元素是0.

MULTIBYTE CHARACTER

&#34;多字节&#34;的定义很复杂 它被称为一些特殊的编码模式,它使用可变数量的字节来表示(抽象)字符 您需要有关执行字符集的信息才能正确处理多字节字符集 但是,即使您有多字节字符,它仍然在内存中表示为字节序列。

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

广泛的字符

宽字符是另一组(抽象)字符的元素,与char类型中表示的字符不同。
这是一组&#34;宽字符&#34;大于&#34;单字节字符&#34;的集合 但事实并非如此。

&#34;广泛字符的相关事实&#34;如下:

  • &#34;宽字符&#34;的集合,无论它们是什么,都可以用wchar_t类型的值范围表示。
  • 这些字符可能与char类型中表示的字符不同。
  • A&#34;广泛的角色&#34;可以使用超过1个字节的存储空间。
  • A&#34;宽弦&#34;是一个以空值终止的连续序列&#34;宽字符&#34;。

因此,&#34;宽字符串&#34;是一个不同的对象而不是&#34;字符串&#34;。

结论

字符串与&#34;宽&#34;无关。字符,但只有&#34;单字节字符&#34;。
字符串是一个以空字符结尾的连续序列&#34; bytes&#34;,这反过来意味着某些char类型的对象:char, signed char, unsigned char,对应于一个代码点适合1个字节的抽象字符集。