在 C 中处理具有长度的字符串

Handle a string with length in C

在C(不是C++)中,我们可以想出几种处理字符串长度的方法:

就个人而言,我更喜欢使用第二种方法,因为

我的问题是:在 C 中处理字符串最常用的方法是什么? (特别是:当我们必须使用大量字符串时(例如编写解释器))

谢谢。

大多数 C 程序员只是简单地使用 asciiz 字符串并接受其低效率。 C 仍然是一种非常快的语言。

但是,如果您要进行大量字符串处理,则可能值得编写一个专用的字符串库或套件。因此,具有长度成员和指针的结构是显而易见的选择。但是,如果你真的很高级,例如对于遗传数据处理,你会发现你需要诸如后缀树之类的结构,它允许在 O(constant) 时间内搜索子字符串。

What is the most-used way to handle strings in C?

毫无疑问,到目前为止最常见的方式就是简单地依赖空终止。

是"best"方式吗?可能不会。就执行速度和程序设计而言,使用自定义字符串库可能是 "best" 方式。不利的一面是您必须拖拽该库,因为 C 没有标准甚至事实上的标准字符串库。

显然最常用的方式是空终止方式,因为标准库支持这种方式。

为字符串编写自己的结构可能对您的目的有意义,但它永远不会成为 "the most used way",因为它不是标准方式。

在 C 语言中,根据定义,字符串是一个空终止字符串。这就是为什么乱码字符串以空字符结尾,以及标准库的 strxxx 函数对以空字符结尾的字符串进行操作的原因。

另一方面,字符数组可以包含您想要的内容,包括空值,您必须以另一种方式传递它们的长度,就像任何其他数组一样。

由于 C 处理字符串文字的方式和 C 标准库,C 程序员通常使用空终止字符串。但值得注意的是,在 C++ 中,a std::string 接近(*)字符数组和长度,即使它是不同的语言 C++,C++ 标准的介绍说(强调我的):

C++ is a general purpose programming language based on the C programming language...

另一个例子是 Windows API 在内部将 unicode 字符串管理为 BSTR 的方式。 BSTR 是一个特殊的 uint16_t 数组,其中长度在 -1 偏移处。选择它是为了与 Visual Basic 兼容。

因此,如果您需要它,使用定义为结构数组 + 长度的 strings 构建一个库非常好...或使用 WINAPI实施(如果合适)或迁移到 C++。


(*) 事实上,C++ 字符串是一个 智能指针 计算对字符数组及其长度的引用