在 C 中处理具有长度的字符串
Handle a string with length in C
在C(不是C++)中,我们可以想出几种处理字符串长度的方法:
只依赖空终止符([=10=]
):我们假设字符串不包含[=10=]
。将字符串存储到 char
数组并在末尾附加 [=10=]
。当我们需要它的大小时,使用像 strlen()
这样的函数。
将字符和长度存入一个struct
:
typedef struct _String {
char* data;
int size;
} String;
使用另一个变量存储长度:例如,
char name[] = "hello";
int name_size = 5;
some_func(name, name_size, ...);
就个人而言,我更喜欢使用第二种方法,因为
可以覆盖中间包含[=10=]
的'weird'个字符串
我们可能会实现string_new()
、string_del()
、string_getitem()
等功能,写一些'OOP-like'代码
我们不需要两个(或更多)变量一起处理字符串及其长度。
我的问题是:在 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++ 字符串是一个 智能指针 计算对字符数组及其长度的引用
在C(不是C++)中,我们可以想出几种处理字符串长度的方法:
只依赖空终止符(
[=10=]
):我们假设字符串不包含[=10=]
。将字符串存储到char
数组并在末尾附加[=10=]
。当我们需要它的大小时,使用像strlen()
这样的函数。将字符和长度存入一个
struct
:typedef struct _String { char* data; int size; } String;
使用另一个变量存储长度:例如,
char name[] = "hello"; int name_size = 5; some_func(name, name_size, ...);
就个人而言,我更喜欢使用第二种方法,因为
可以覆盖中间包含
[=10=]
的'weird'个字符串我们可能会实现
string_new()
、string_del()
、string_getitem()
等功能,写一些'OOP-like'代码我们不需要两个(或更多)变量一起处理字符串及其长度。
我的问题是:在 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++ 字符串是一个 智能指针 计算对字符数组及其长度的引用