【问题标题】:Removing a substring from a char array without using any libraries in C在不使用 C 中的任何库的情况下从 char 数组中删除子字符串
【发布时间】:2020-05-30 23:33:45
【问题描述】:

我是一名计算机科学一年级的学生,我们的老师布置了一个二元模式搜索任务。我们必须在不使用任何库和内置函数(如 memmove 或 strstr)的情况下从字符串中删除子字符串。我们唯一的提示是它与“\0”有关。我不知道我们将如何实现这一点,因为我知道空字符只结束一个字符串而不是删除它。并且给定一个未知的输入,它变得更加难以解决。我需要有关使用空字符的帮助。编辑:哦,我们也不允许创建新数组。 EDIT2:如果您在这里寻求解决方案,则问题要复杂得多,请阅读此线程下的 cmets 以及标记的解决方案。

【问题讨论】:

  • 提示仅在子字符串结束原始字符串时才有用。在这种情况下,您将使用 \0 char 在子字符串之前结束原始字符串。
  • 为了让这个问题更多地集中在你有问题的部分,请展示代码环境。 IE。为程序创建一个minimal reproducible example,该程序提供以适当方式处理的字符串,有一部分要通过删除实现进行扩展,最终可以输出删除的结果。
  • 请注意,我不假设要删除的子字符串位于输入字符串的末尾。关于零的提示可能只是关于如何处理字符链以及如何在缩短字符串后结束字符串的提示,以避免在中重复最后一部分(删除字符串的长度)输出。如果您的作业中有任何内容支持子字符串位于末尾的假设,请纠正我。如果你能给出输入字符串和子字符串的例子,即使没有解释,它也会变得很明显。
  • @Yunnosch 是的,这是我们无法对子字符串的位置做出任何假设的棘手部分。此外,这个任务比仅仅删除一个子字符串要大得多。我们必须递归地执行它,直到我们搜索的每个子字符串模式都从给定的输入中消失。 IE。 “10011”如果我们从这个字符串中删除“01”,一个新的“01”将出现在剩余部分,我们也必须删除它。
  • 您应该明确地 edit 在您的问题中提供有用的附加信息,因为例如现有答案表明,当前的询问方式很容易产生误导,并导致答案不正确。

标签: c arrays string null substring


【解决方案1】:

C 字符串是“以空值结尾的”,这意味着它们被视为在任何出现空值(用 C 写为 '\0')的地方结束。

如果我从字符串“Stack Overflow”开始并用'\0' 覆盖空间,我现在有了字符串“Stack”。 “溢出”的存储仍然存在,但根据 strlen()printf() 等 C 函数,它不是字符串的一部分。事实上,如果我持有指向原始字符串的“O”部分的指针,就好像有两个字符串:“Stack”和“Overflow”,你仍然可以同时使用它们。

这就像我来到你住的地方,我在你家门前的马路对面建了一堵巨大的墙。这条路现在变短了,我这边的人不会知道你在那里。

【讨论】:

  • 感谢您的回答和清晰的类比:D。但我的问题在这里也变得更加复杂。也许我的问题有点误导,但我也想打印空值之后的部分。让我用一个例子来澄清一下。我想从“堆栈溢出”中删除“结束”,但在“结束”之前放置和 \0 也会删除“流”。我希望最终输出是“堆栈流”。
  • 那么你必须用 "flow\0" 覆盖 "over",除非我遗漏了什么。
  • @BobtheMagicMoose 哦,哇,这可能有用。我一直在想这个问题太多以至于我错过了这一点。天哪,我很震惊,谢谢。
  • @MustafaÇığGökpınar:我可以想到两种方法。首先,您可以创建一个指向“f”的指针,它为您提供字符串“flow”,并将“O”替换为 null 以获得“Stack”。然后你有两个字符串,你需要打印这两个字符串以获得“堆栈流”。或者,如果结尾必须是单个字符串,您可以按照 Bob 的建议进行操作。
  • 现在我将尝试实现 bob 的解决方案,因为我们被要求返回一个 char 指针。感谢你的帮助。我会将您的答案标记为正确的解决方案,人们可​​以阅读评论部分以获得真正的答案。
猜你喜欢
  • 1970-01-01
  • 2015-07-18
  • 2021-11-14
  • 2012-05-10
  • 1970-01-01
  • 2023-03-09
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多