繁体   English   中英

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

[英]Remove spaces from a string, but not at the beginning or end

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

例如

hello  everyone this     is a test

你好和每个人之间有两个空格,其中有五个空格。 最终我想要从5中删除2和4中的1个空格,因此每个间隙都有1个空格。 合理?

这就是我要做的事情:

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

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

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

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

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

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

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

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

例:

         write
          V
xxxx_xxxx__xxx
           ^
          Read

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM