在C中使用字符串有哪些第三方选项?
我已经知道有一段时间我在Python中编码的速度比在C中快17倍,我想我有点假设我不是一个程序员,直到我真正想到它并意识到唯一的问题是我能够处理C字符串/字符数组/字符指针/无论如何。 我对它们有一个阻碍,操纵它们需要几个小时。 我在C ++中没有这个问题。
但生活迫使我现在用纯C编码,我试图找到是否有一些我可以添加的第三方库,这将使我的生活更轻松。 我做了一些谷歌搜索,我真的没有找到太多。 我开始考虑自己做,但我觉得我要重新发明轮子。 肯定有什么东西在那里? 有谁知道这样的事情? 在这方面使C更像C ++的东西。 我意识到这是一个愚蠢的想法,因为这是C ++的重点,但你理解,我敢肯定。
有一个更好的字符串库 ,它是一个纯C库,用于处理“字符串”,试图避免标准C字符串处理的许多问题。
http://developer.gnome.org/glib/2.34/glib-utilities.html
http://developer.gnome.org/glib/2.34/glib-Strings.html
它是gnome的基础,但我认为你可以独立于gnome使用它。 根据概述页面,“它适用于许多类UNIX平台,以及Windows和OS X.”
您可以通过阅读SO上的相关问题来开始解决指针/数组/字符串问题。 这些问题不乏。
为了编写包含指针/数组/字符串的正确C代码,您必须学习和理解一些重要的事项:
- 指针,数组,指针指针,数组指针,数组数组,指针数组等的声明。 对于没有经验的人来说,C声明确实很奇怪。 但是,它们是可以学习的,并且有一些像
cdecl
这样的工具可以快速将abracadabrish声明翻译成简单的英语或反过来。 - 如果你看到一个函数将其中一个参数声明为一个数组(例如
void f(int a[])
),那就不要相信你的眼睛了。 它是一个指针,而不是一个数组。 在C中,数组永远不会作为函数参数传递。 只传递指针。 语法具有欺骗性,C的创建者对此类事情表示遗憾,但现在这些都是历史。 你无法改变它。 - 在所有C表达式中(不要与声明和定义混淆),除了一个,数组表现为指向其第一个元素的指针。
sizeof
运算符是个例外。sizeof(array)
将返回chars
的真实数组大小。 但是当你执行sizeof(array+0)
,你已经将array
转换为指向array[0]
的指针类型的表达式,在这种情况下,sizeof
将返回指针的大小。 - 您无法分配数组。 您可以在定义它们时初始化它们,您可以复制它们,但在定义它们之后不能使用
=
赋值。 - C中没有基本类型的字符串。 只有
chars
,chars
数组和chars
指针以及指向chars
数组的指针,我们经常将它们全部称为字符串,但它们实际上并非如此。 你看到的字符串,例如"I am a string. Or maybe I'm not."
被称为字符串文字,在某处有一个与之关联的chars
数组。 我在某处说,因为字符串文字在不同的上下文中表现不同。 在所有C表达式中(不要与声明/定义混淆),除了大约一个,字符串文字表现为指向包含文字文本的数组的第一个char
的指针。sizeof
例外是sizeof
。 它会返回像sizeof("ABC")
这样的基础chars
数组的sizeof("ABC")
。 再次,就像数组一样,当你写sizeof("ABC"+0)
,你已经将"ABC"
转换为指向char
的指针,而sizeof
将返回指针的大小。 - 您不能尝试修改由字符串文字创建的
char
数组:"ABC"[0] = 'Z';
是未定义的行为。char* p = "ABC"; p[0] = 'Z';
char* p = "ABC"; p[0] = 'Z';
或等效的char* p = "ABC"; *p = 'Z';
char* p = "ABC"; *p = 'Z';
。 - 您可以使用字符串文字来初始化
chars
数组或指向chars
指针(您也可以将字符串文字分配给指针,但不能分配给数组,数组不可分配,如前所述)。 发生什么取决于你正在初始化什么。 在char a[] = "Hello";
或者在char a[] = { "Hello!" };
char a[] = { "Hello!" };
您创建一个chars
数组,并将其内容设置为字符串文字中的文本。 如果需要,您可以在之后修改该数组。 在char* p = "World!";
您创建一个包含文字字符串文本的char
数组,并创建指向指向该数组的第一个char
指针。 在这种情况下,你不能像我之前指出的那样改变数组。 - 由空格分隔的两个或多个相邻的字符串文字合并为一个:
"Hello" " World!"
与"Hello World!"
。 - 还有指针算术,但很容易。
这是关于它的。 主声明,表达式和函数参数中的主数组,观察字符串文字。
虽然不总是需要重新发明轮子。 我倾向于认为,通过这样做,您可以更好地理解事物的运作方式。 但是,不确定你正在使用什么类型的时间框架。否则,如另一个答案中所提到的,Better String Library是一个非常好的。