将字符串实现为带有空标记的字符数组与C中的其他方法相比,决策背后的原因是什么?

问题描述 投票:1回答:2

第一次看C,我发现一个字符串实际上是一个char[] - 我想知道有多少种方法可以实现一个字符串数据类型?

对这个问题的评论(Why does a string of N chars require initializing an array of N + 1 chars in C?

对于字符串数据类型,您需要知道长度。您可以拥有一个具有长度字段(和char数组)的结构,或者您需要一个特殊的标记来表示字符串的结尾。在C中,选择了特殊标记方法,标记为空字符

意味着只有两种方法可以实现字符串结构?

  1. 带有空标记的char[]
  2. 一种对象,提供指向char[]的开头和其他必要元数据的指针

是否有其他方法来实现字符串数据类型?为什么C接近(1)?

c string
2个回答
4
投票

为什么C采取接近(1)?

根据The Development of the C Language的说法,这是为了避免固定弦乐的最大长度,并且他们的个人经历使他们相信终结者更方便。

BCPL,B或C都不支持该语言中的字符数据;每个字符串都像整数向量一样对待字符串,并通过一些约定来补充一般规则。在BCPL和B中,字符串文字表示用字符串字符初始化的静态区域的地址,打包到单元格中。在BCPL中,第一个打包字节包含字符串中的字符数;在B中,没有计数,字符串由特殊字符终止,B拼写*e。这种改变部分是为了避免因在8位或9位插槽中保持计数而导致的字符串长度限制,部分原因是根据我们的经验,保持计数似乎不如使用终结器。

是否有其他方法来实现字符串数据类型?

没有什么显着不同,只要字符串被定义为由连续的字节组成。


1
投票

请记住,C的开发主要是为了实现UNIX操作系统 - 文本处理不是它的重点。

将字符串和字符串操作映射到数组是有意义的,因为字符串是字符值序列。数组上的现有操作(例如它们)可以非常容易地应用于字符串。连接之类的一些操作变得简单易行。

使用终结符而不是前导长度字节意味着字符串长度没有上限。

有时候有一个真正的字符串数据类型会很好,不同于char数组。但是,在大多数C编程中,这些时间足够少,而且这种方法足够好。

© www.soinside.com 2019 - 2024. All rights reserved.