问题描述
|
在C标准库中,字符串使用字符数组来实现,字符数组以空字符\'\\ 0 \'结尾。这样的ASCIZ字符串导致效率低下,因为每次我们需要知道字符串的长度时,我们都需要遍历它以查找\'\\ 0 \'。
解决此问题的方法是在创建字符串时存储字符串的长度,例如使用如下结构:
typedef struct cstring_ {
size_t nchars;
char chars[0];
} cstring;
是否有人制作了实现string.h函数的共享库,但是使用结构而不是char *
传递字符串?
如果不是,是否有一个特定的原因为什么这是一个坏主意?
解决方法
大概有几十个。以Glib \的GString为例。
,
是否有人制作了实现string.h函数的共享库,但是使用结构而不是库,确保在字符串中需要更多空间时使用重新分配。
但是,这只是出于学习目的(从那时起,我移至C ++,现在使用std :: string)。
有什么特定的原因为什么这是个坏主意?
我想自己尝试一下是个好主意:这样,使用正确的API,您可以沿着字符串记住字符串的长度,缓冲区的大小,如果您想尝试复制,甚至可以记住一个参考计数器写的概念。您的字符串将更复杂,但在某些情况下比默认字符串更有效。这是一个很好的学习经验。
但是对于生产代码,还是一如既往,您要么非常有经验,要么应该尝试找到一个比您做得更好的库。
我知道一些使用此备用字符串的生产就绪型实现。
Mat已经提到了GLib \的GString。
如果您使用的是Windows编码,则Microsoft的BSTR(及其C ++包装器bstr_t)可以解决您的问题:可以像3字符串一样读取它们,并使用SysAllocString及其姐妹函数SysFreeString等。
您可以将它们用于生产代码,或者用于学习目的,向他们学习。
, 从C常见问题解答
尽管它很流行,但该技术
还有些臭名昭著:丹尼斯
里奇称其为``无根据的
C的笨拙
实施,\'\'和一名官员
解释认为这是
不严格符合C
标准,虽然看起来确实
在所有已知的实现下工作。
(检查数组边界的编译器
可能会发出警告。)
我也认为应该是
char *
传递字符串?
是的
11年前,当我学习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样式字符串。