【问题标题】:Remove spaces from a string, but not at the beginning or end从字符串中删除空格,但不在开头或结尾
【发布时间】:2010-02-17 10:01:30
【问题描述】:

我试图从 C 中的字符串中删除空格,而不是从结尾,也不是开头,只是字符串中的多个空格

例如

hello  everyone this     is a test

hello 和 everyone 之间有两个空格,从 this to is 有五个空格。最终我想从 2 中删除 1 个空格,从 5 中删除 4 个空格,所以每个间隙都有 1 个空格。有意义吗?

这就是我要做的:

  • 创建一个指针,将其指向元素 1 char[0] 处的字符串。

  • 对字符串的长度进行for循环

  • 那么我的逻辑是,如果我在 [i] 处的指针是一个空格,而我在元素 [i+1] 处的指针是一个空格,那么就做某事

我不太确定这里有什么好的解决方案,请记住我不会使用任何预构建的功能。有人有什么想法吗?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    一种方法是就地进行。从头到尾循环遍历字符串。存储一个写指针和一个读指针。每循环一次,写指针和读指针都会前进一个。当您遇到空间时,将其正常传输,然后循环读取指针每次递增,直到找到非空间(或字符串的结尾,显然)。不要忘记在末尾添加一个 '\0',这样您现在就有了相同的字符串,但没有空格。

    【讨论】:

      【解决方案2】:

      您是否允许使用额外的内存来创建字符串的副本或者您需要就地进行处理?

      最简单的方法是按照原始字符串的大小分配内存并复制那里的所有字符。如果遇到多余的空格,请不要复制。

      如果需要就地执行,则创建两个指针。一个指向正在读取的字符,一个指向正在复制的字符。当您遇到额外的空格时,请调整“读取”指针以指向下一个非空格字符。将读取字符指向的字符复制到写入位置。然后将读取指针前进到要复制的字符之后的字符。每当执行复制时,写指针都会加一。

      例子:

               write
                V
      xxxx_xxxx__xxx
                 ^
                Read
      

      【讨论】:

      • 你的方法(和我的一样)在你意识到的地方同样有效:)
      【解决方案3】:

      这里的一个难点是你不能轻易地从字符数组中删除一个元素。您当然可以创建一个函数,该函数返回一个删除了一个特定元素的 char[]。另一种选择是创建一个额外的数组来指示您应该保留哪些字符,然后再遍历 char[] 一次,只复制您想要保留的字符。

      【讨论】:

        【解决方案4】:

        这是基于 Goz 所说的,但我认为他的手指有问题,因为我很确定他所描述的内容会去除所有空格(不仅仅是每次运行的第二个开始)。

        编辑 - 哎呀 - 关于 Goz 的错误,尽管“额外的一个”措辞只会正确涵盖两个空格的运行。

        编辑 - 哎呀 - 预先编写的解决方案已删除...

        不过,一般的想法是像其他人一样使用“from”和“to”指针,但也要保留从一次迭代到下一次迭代的一些信息(状态),以便您决定是否处于是否已经有一系列空格。

        【讨论】:

        • 别担心我无论如何都不会使用它,我喜欢上面的读写想法的想法,不确定这个是否使用过,anwyays 现在没关系了;)
        • @leo - Goz 和 kgiannakakis 肯定给出了一个很好的起点。不过,尼尔是对的,而且我已经写了足够多类似的抱怨,以至于我现在脸红了:-(
        【解决方案5】:

        您可以对"  "" " 进行查找和替换,并继续执行此操作直到找不到更多匹配项。效率低下,但合乎逻辑。

        【讨论】:

          猜你喜欢
          • 2011-12-22
          • 1970-01-01
          • 2011-03-23
          • 2016-08-05
          • 2018-07-01
          • 2013-10-07
          • 2021-04-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多