有没有人使用结构体来存储字符串和长度来实现string.h的替代?

问题描述

| 在C标准库中,字符串使用字符数组来实现,字符数组以空字符\'\\ 0 \'结尾。这样的ASCIZ字符串导致效率低下,因为每次我们需要知道字符串的长度时,我们都需要遍历它以查找\'\\ 0 \'。 解决此问题的方法是在创建字符串时存储字符串的长度,例如使用如下结构:
typedef struct cstring_ {
    size_t nchars;
    char chars[0];
} cstring;
是否有人制作了实现string.h函数的共享库,但是使用结构而不是
char *
传递字符串? 如果不是,是否有一个特定的原因为什么这是一个坏主意?     

解决方法

        大概有几十个。以Glib \的GString为例。     ,           是否有人制作了实现string.h函数的共享库,但是使用结构而不是
char *
传递字符串? 是的 11年前,当我学习C:时,我重新实现了整个库,确保在字符串中需要更多空间时使用重新分配。 但是,这只是出于学习目的(从那时起,我移至C ++,现在使用std :: string)。   有什么特定的原因为什么这是个坏主意? 我想自己尝试一下是个好主意:这样,使用正确的API,您可以沿着字符串记住字符串的长度,缓冲区的大小,如果您想尝试复制,甚至可以记住一个参考计数器写的概念。您的字符串将更复杂,但在某些情况下比默认字符串更有效。这是一个很好的学习经验。 但是对于生产代码,还是一如既往,您要么非常有经验,要么应该尝试找到一个比您做得更好的库。 我知道一些使用此备用字符串的生产就绪型实现。 Mat已经提到了GLib \的GString。 如果您使用的是Windows编码,则Microsoft的BSTR(及其C ++包装器bstr_t)可以解决您的问题:可以像3字符串一样读取它们,并使用SysAllocString及其姐妹函数SysFreeString等。 您可以将它们用于生产代码,或者用于学习目的,向他们学习。     ,        从C常见问题解答   尽管它很流行,但该技术   还有些臭名昭著:丹尼斯   里奇称其为``无根据的   C的笨拙   实施,\'\'和一名官员   解释认为这是   不严格符合C   标准,虽然看起来确实   在所有已知的实现下工作。   (检查数组边界的编译器   可能会发出警告。) 我也认为应该是
char chars[1];
。     ,        是的,有很多库可以做到这一点,包括Glib,BString,VStr等。问题在于它们通常很难使用,或者至少需要学习非标准的API来处理字符串。 (C ++的ѭ5是正确处理字符串的示例,但它取决于许多C ++功能。) 如果您担心ѭ6的开销,则应在对字符串进行操作时计算字符串“ manually”的长度,并使用ѭ7进行大多数操作并直接访问字符。不过,这仅在紧密循环中有用。     ,        我在我的一个项目中实现了这样的事情(但是,我使用类而不是struct)。易于实现。最好将所有内容(包括长度)存储在一个存储区中,并将一个字符串表示为指向字符串数据本身开头的指针。     ,        我发现,每当我需要一个\“ string \”的长度时,我真正需要的是知道该字符串是否为空或是否达到了它的末尾。有时我仍然需要遍历字符,这样我就可以轻松地检查NULL。 因此,让我重新表述您的问题:您是否有特定原因认为这是一个更好的主意?     ,        我认为这不是一个坏主意,实际上string的C ++实现就像您所说的那样。还有glib中的c实现,例如gstring。它几乎是linux世界中的一个标准库。我认为它不是标准c库的原因是因为c lang的历史太久了,并且大多数开发人员和项目都习惯于使用原始的c样式字符串。