C 删除字符串中的空格,但不要在开头或结尾

C 删除字符串中的空格,但不要在开头或结尾,c,pointers,C,Pointers,我试图从C中的字符串中删除空格,而不是从末尾,也不是从开头,而是一个字符串中的多个空格 比如说 hello everyone this is a test 在hello和everyone之间有两个空格,从这个到is有五个空格。最后,我想从2中删除1个空格,从5中删除4个空格,这样每个空格正好有1个空格。有道理吗 这就是我要做的: 创建一个指针,将其指向元素1 char[0]处的字符串 在字符串的长度上执行for循环 那么我的逻辑是,如果我指向[i]的指针是一个空间,而我指向元素[i

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

比如说

hello  everyone this     is a test
在hello和everyone之间有两个空格,从这个到is有五个空格。最后,我想从2中删除1个空格,从5中删除4个空格,这样每个空格正好有1个空格。有道理吗

这就是我要做的:

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

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

  • 那么我的逻辑是,如果我指向[i]的指针是一个空间,而我指向元素[i+1]的指针是一个空间,那么我需要做一些事情


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

一种方法是就地完成。从头到尾循环字符串。存储一个写指针和一个读指针。每个循环的写指针和读指针前进一步。当您遇到一个空格时,它将正常传输,但随后每次循环读取指针递增,直到找到一个非空格(或者字符串的结尾,很明显)。不要忘了在末尾添加“\0”,这样您就拥有了没有空格的相同字符串。

这里的一个难点是,您无法轻松地从字符数组中删除元素。当然,您可以创建一个函数,该函数返回一个已删除一个特定元素的char[]。另一个选项是创建一个额外的数组,指示应该保留哪些字符,然后再对char[]进行一次检查,只复制要保留的字符。

是否允许使用额外的内存创建字符串的副本,还是需要就地处理

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

如果需要在适当的位置执行,那么创建两个指针。一个指向正在读取的字符,一个指向正在复制的字符。当遇到一个额外的空格时,将“read”指针调整为指向下一个非空格字符。将读取字符指向的字符复制到写入位置。然后,在复制字符后,将读取指针前进到该字符。每当执行复制时,写入指针将递增1

例如:

         write
          V
xxxx_xxxx__xxx
           ^
          Read

这是基于Goz所说的,但我认为他手指有问题,因为我很确定他所描述的会去掉所有的空格(不仅仅是每次跑步的第二个空格)

编辑-oops-关于Goz的说法是错误的,尽管“额外一个”的措辞只能正确地覆盖两个空格

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


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

您可以对
执行查找和替换操作,继续这样做,直到找不到匹配项为止。效率不高,但逻辑性不强。

你的方法(与我的方法相同)也同样适用于你意识到的地方:)别担心,我无论如何都不会使用它,我喜欢上面读写的想法,不确定这是否会用到它,反正它已经不重要了;)@利奥-戈兹和克吉安纳卡基斯无疑提供了一个良好的起点。Neil是对的,我写了很多类似的抱怨,现在我脸红了:-(