繁体   English   中英

处理长度为C的字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM