从字符串中删除空格,但不在开头或结尾处删除空格

时间:2010-02-17 10:01:31

标签: c pointers

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

例如

hello  everyone this     is a test

在hello和每个人之间有两个空格,并且从这里有五个空格。最终我想要从5中删除2和4中的1个空格,因此每个间隙都有1个空格。有意义吗?

这就是我要做的事情:

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

  • 在字符串的长度上执行for循环

  • 然后我的逻辑是,如果我在[i]的指针是一个空格而我的指针在元素[i + 1]空间然后做某事

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您是否可以使用额外的内存来创建字符串的副本,或者您需要进行适当的处​​理?

最简单的方法是将内存平均分配给原始字符串的大小并复制其中的所有字符。如果您遇到额外的空间,请不要复制它。

如果你需要这样做,那么创建两个指针。一个指向正在读取的字符,一个指向要复制的字符。当您遇到额外的空间时,请调整“读取”指针以指向下一个非空格字符。将读取字符指向的字符复制到写入位置。然后在复制字符后将读指针前进到字符。无论何时执行复制,写指针都会递增1。

示例:

         write
          V
xxxx_xxxx__xxx
           ^
          Read

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是基于Goz所说的,但我认为他有手指麻烦,因为我很确定他所描述的会剥离所有空间(而不仅仅是每次运行的第二次)。

编辑 - oops - 关于Goz的错误,虽然“额外的”措辞只会正确地覆盖两个空格的运行。

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

但是,一般的想法是像其他人一样使用“from”和“to”指针,但也要保留一次迭代到下一次迭代的一些信息(状态),以便你可以决定是否在已经或没有空间。

答案 4 :(得分:0)

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