[英]Handle a string with length in C
在C(不是C ++)中,我们可以考虑几种处理字符串的方法:
仅依靠空终止符( \\0
):我们假设字符串不包含\\0
。 将字符串存储到char
数组,并在末尾附加\\0
。 需要大小时,请使用诸如strlen()
类的函数。
将字符和长度存储到struct
:
typedef struct _String { char* data; int size; } String;
使用另一个变量存储长度:例如,
char name[] = "hello"; int name_size = 5; some_func(name, name_size, ...);
我个人更喜欢使用第二种方法,因为
它可以覆盖一些在中间包含\\0
“怪异”字符串。
我们可以实现一些函数,例如string_new()
, string_del()
, string_getitem()
等,以编写一些类似于“ OOP”的代码。
我们不必两个(或多个)变量来一起处理字符串及其长度。
我的问题是:在C中处理字符串的最常用方法是什么? (尤其是:当我们不得不使用很多字符串(例如编写解释器)时)
谢谢。
在C中处理字符串的最常用方法是什么?
毫无疑问,到目前为止,最常见的方法就是简单地依靠null终止。
这是“最佳”方式吗? 可能不是。 就执行速度和程序设计而言,使用自定义字符串库可能是“最佳”方法。 缺点是您将不得不拖拽该库,因为没有C的标准甚至是事实上的标准字符串库。
大多数C程序员只是使用asciiz字符串并接受效率低下的问题。 C仍然是一种非常快速的语言。
但是,如果您要进行大量的字符串处理,则值得编写一个专用的字符串库或套件。 因此,具有长度成员和指针的结构是显而易见的选择。 但是,如果您真的很先进,例如在遗传数据处理方面,您会发现需要诸如后缀树之类的结构,这些结构允许在O(恒定)时间内搜索子字符串。
显然,最常用的方法是以空值终止的方法,因为标准库支持该方法。
为字符串编写自己的结构可能对您的目的有意义,但是它永远不会成为“最常用的方式”,因为它不是标准方式。
在C语言中, 根据定义 ,字符串是一个以null结尾的字符串。 这就是为什么乱码字符串以null终止的原因,以及标准库的strxxx
函数对以null终止的字符串进行操作的原因。
另一方面,字符数组可以包含所需的内容(包括空值),并且您必须以其他方式传递它们的长度,就像其他任何数组一样。
由于C处理字符串垃圾和C标准库的方式,C程序员通常使用以null结尾的字符串。 但是值得注意的是,在C ++中,std :: string与字符数组和长度接近(*),即使它是另一种语言C ++,C ++标准的引入也说明了这一点(强调我的意思):
C ++是基于C编程语言的通用编程语言 。
另一个示例是Windows API在内部将Unicode字符串作为BSTR管理的方式。 BSTR是uint16_t的特殊数组,其中长度为-1偏移。 选择它是为了与Visual Basic兼容。
因此,如果需要,使用定义为struct array + length ...的字符串来构建库是非常好的,或者在适当的情况下使用WINAPI实现或迁移到C ++。
(*)实际上,C ++字符串是一个智能指针,用于计算对字符数组及其长度的引用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.