【问题标题】:What third-party options are there for working with strings in C?有哪些第三方选项可用于在 C 中处理字符串?
【发布时间】:2012-10-04 00:21:21
【问题描述】:

我已经意识到我在 Python 中的编码速度比在 C 中快大约 17 倍,我想我有点假设我不是一个程序员,直到我真正考虑它并意识到唯一的问题是我无法处理 C 字符串/char 数组/char 指针/任何东西。我对它们有一个障碍,操纵它们需要我几个小时。我在 C++ 中没有这个问题。

但目前生活迫使我使用纯 C 语言编写代码,我正在努力寻找是否可以添加一些第三方库来让我的生活更轻松。我做了一些谷歌搜索,但我并没有真正找到太多。我开始考虑自己做,但我觉得我会重新发明轮子。那里肯定有东西吗?有谁知道这样的事情?在这方面使 C 更像 C++ 的东西。我意识到这是一个愚蠢的想法,因为这就是 C++ 的重点,但你明白,我敢肯定。

【问题讨论】:

  • @Aerovistae:你不应该为你不想回答的语言标记问题——c++ 标签可能是让@blearn 离开的原因。 :-]
  • @blearn 我认为他想要一个 C 库,而不是 C++。
  • 对不起,哈哈。我半希望一些 C++ 大师会从天而降,告诉我他们为 C 创建了一个#include
  • “我无法处理 C 字符串/char 数组/char 指针/其他任何东西。我有一个关于它们的块,并且操作它们需要我几个小时” - 这告诉我一般来说,当涉及到指针(即直接操作内存)时,你有一个障碍,这对于任何认真的 C 程序员来说都是必须的。这不仅仅是字符串。有些人似乎比其他人在使用指针时(非常)困难。
  • @Aerovistae 这是值得弄清楚的事情first - C 库可能无助于解决这个问题,至少不能完全解决,因为它是你必须掌握的核心概念在 C 中有效。

标签: c string libraries arrays


【解决方案1】:

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

【讨论】:

  • 但那是 C++,不是吗?如何将它与 C 文件一起使用?
  • @Aerovistae 不。它是纯 C,带有 C++ 包装器(包括在内,但可选)。
  • 很遗憾 - 矩阵中有这么多绿色检查并且没有 i18n 支持:(
  • @pst 是的 - 但根据需要仍然有用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以通过阅读有关 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 是个例外。它将以sizeof("ABC") 之类的形式返回chars 的底层数组的大小。同样,就像数组一样,在您编写 sizeof("ABC"+0) 的那一刻,您已将 "ABC" 转换为指向 char 的指针,sizeof 将返回指针的大小。
    6. 您不得尝试修改由字符串文字创建的char 数组:"ABC"[0] = 'Z'; 是未定义的行为。 char* p = "ABC"; p[0] = 'Z'; 或等效的 char* p = "ABC"; *p = 'Z'; 也是如此。
    7. 您可以使用字符串文字来初始化chars 的数组或指向chars 的指针(您也可以将字符串文字分配给指针,但不能分配给数组,数组不可分配,如前所述)。会发生什么取决于您正在初始化什么。在char a[] = "Hello";char a[] = { "Hello!" }; 中,您创建一个chars 数组,并将其内容设置为字符串文字中的文本。如果需要,您可以在之后修改该数组。在char* p = "World!"; 中,您创建一个包含文字字符串文本的char 数组,并创建一个指向char 的指针,该指针指向该数组的第一个char。在这种情况下,您不能像我之前指出的那样更改数组。
    8. 两个或多个由空格分隔的相邻字符串文字合并为一个:"Hello" " World!""Hello World!" 相同。
    9. 还有指针运算,但很简单。

    这就是它。主声明、表达式和函数参数中的主数组,注意你的字符串文字。

    【讨论】:

      【解决方案4】:

      虽然并不总是需要重新发明轮子。我倾向于认为通过这样做,您可以更好地了解事物的运作方式。不过,不确定您正在使用哪种类型的时间范围。否则,正如另一个答案中提到的,更好的字符串库是一个非常好的。

      【讨论】:

        猜你喜欢
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        相关资源
        最近更新 更多