在C中使用字符串有哪些第三方选项?

时间:2012-10-04 00:21:21

标签: c string libraries arrays

我已经知道有一段时间我在Python中的编码速度比在C中快17倍,我想我有点认为我不是一个程序员,直到我真正想到它并意识到唯一的问题是我无法处理C strings / char数组/ char指针/无论如何。我对它们有一个阻碍,操纵它们需要我几个小时。我在C ++中没有这个问题。

但是生活迫使我现在用纯C编码,我试图找到是否有一些我可以添加的第三方库,这将使我的生活更轻松。我做了一些谷歌搜索,我真的没有找到太多。我开始考虑自己做,但我觉得我要重新发明轮子。肯定有什么东西在那里?有谁知道这样的事情?在这方面使C更像C ++的东西。我意识到这是一个愚蠢的想法,因为这是C ++的重点,但你理解,我很有信心。

4 个答案:

答案 0 :(得分:5)

Better String Library,它是一个纯C库,用于处理“字符串”,试图避免标准C字符串处理的许多问题。

答案 1 :(得分:3)

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.”

答案 2 :(得分:2)

您可以通过阅读SO上的相关问题来开始解决指针/数组/字符串问题。这些问题并不缺乏。

为了编写包含指针/数组/字符串的正确C代码,您必须学习和理解一些重要的事项:

  1. 指针,数组,指针指针,数组指针,数组数组,指针数组等的声明。对于没有经验的人来说,C声明确实很奇怪。但是,它们是可以学习的,并且有一些工具,如cdecl,可以快速将abracadabrish声明翻译成普通英语或反过来。
  2. 如果您发现函数将其中一个参数声明为数组(例如void f(int a[])),请不要相信您的眼睛。它是一个指针,而不是一个数组。在C中,数组永远不会作为函数参数传递。只传递指针。语法具有欺骗性,C的创建者对此类事情感到遗憾,但现在这都是历史。你无法改变它。
  3. 在所有C表达式中(不要与声明和定义混淆),除了一个,数组的行为就像指向第一个元素的指针一样。 sizeof运算符例外。 sizeof(array)会在chars中返回真正的数组大小。但是当您执行sizeof(array+0)时,您已将array转换为指向array[0]的指针类型的表达式,在这种情况下sizeof将返回指针的大小。
  4. 您无法分配数组。您可以在定义它们时初始化它们,您可以复制它们,但在定义它们之后不能使用=进行分配。
  5. C中没有基本类型的字符串。只有charschars数组和指向chars的指针以及指向chars数组的指针,我们经常将它们全部称为字符串,但它们确实不是'吨。你看到的字符串,例如"I am a string. Or maybe I'm not."被称为字符串文字,某处有与之关联的chars数组。我在某处说,因为字符串文字在不同的上下文中表现不同。在所有C表达式中(不要与声明/定义混淆),除了大约一个,字符串文字表现为指向包含文字文本的数组的第一个char的指针。唯一的例外是sizeof。它将以chars之类的内容返回sizeof("ABC")的基础数组的大小。再次,就像数组一样,在您编写sizeof("ABC"+0)的那一刻,您已将"ABC"转换为指向char的指针,而sizeof将返回指针的大小。< / LI>
  6. 您不得尝试修改由字符串文字创建的char数组:"ABC"[0] = 'Z';是未定义的行为。 char* p = "ABC"; p[0] = 'Z';或等效的char* p = "ABC"; *p = 'Z';
  7. 也是如此
  8. 您可以使用字符串文字初始化chars的数组或指向chars的指针(您也可以将字符串文字分配给指针,但不能分配给数组,数组不可分配,如前所述) )。发生什么取决于你正在初始化什么。在char a[] = "Hello";char a[] = { "Hello!" };中,您创建了一个chars数组,并将其内容设置为字符串文字中的文本。如果需要,您可以在之后修改该数组。在char* p = "World!";中,您创建一个包含文字字符串文本的char数组,并创建指向该char指向该数组的第一个char的指针。在这种情况下,你不能像我之前指出的那样改变数组。
  9. 由空格分隔的两个或多个相邻字符串文字合并为一个:"Hello" " World!""Hello World!"相同。
  10. 还有指针算术,但很容易。
  11. 这是关于它的。主声明,表达式和函数参数中的主数组,观察字符串文字。

答案 3 :(得分:0)

虽然并不总是需要重新发明轮子。我倾向于认为,通过这样做,您可以更好地理解事物的运作方式。虽然,不确定你正在使用什么类型的时间框架。否则,如另一个答案中所提到的,Better String Library是一个非常好的。