从字符串中删除多余的空格(就地)

时间:2010-02-17 16:36:59

标签: c pointers

好的,所以我之前发布了关于尝试(没有任何预建功能)删除额外空格的信息

"this is <insert many spaces!> a test"会返回

"this is a test"

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

由于这是家庭作业,我没有要求完整的解决方案,有些人向我提供了以下

“如果你需要这样做,那么创建两个指针。一个指向正在读取的字符,一个指向要复制的字符。当你遇到一个额外的空间,然后调整'write'指针指向下一个非空格字符。将写入字符指向的字符复制到读取位置。然后在复制字符后提前读取和写入指向字符的指针。“

问题是我现在想把我的电脑完全粉碎成碎片,因为我太烦恼了。我当时没有意识到我不能利用char数组所以使用数组索引来做它,我想我可以帮助它如何让它工作但现在我只是使用指针我发现它很难。我真的需要一些帮助,而不是完整的解决方案到目前为止,这就是我正在做的事情;

1)创建一个名为write的指针,所以我没有写到

的位置

2)创建一个名为read的指针,这样我就无法从

中读取

(这两个指针现在都将指向char数组的第一个元素)

while (read != '\0')
    if read == a space 
        add one to read
        if read equals a space now 
            add one to write
            while read != a space {
                 set write to = read
            }
                 add one to both read and write
    else 
        add one to read and write 
        write = read  

7 个答案:

答案 0 :(得分:6)

尝试在一张纸上逐字逐句地完成这项工作,然后先弄清楚你在做什么,然后将其转化为代码。

如果你仍然遇到麻烦,请先尝试做一些简单的事情,例如只为字符复制字符串字符,而不必担心“删除重复空格”部分 - 只是为了确保你没有做出愚蠢别的错误。

答案 1 :(得分:2)

首先尝试使用笔和纸做的建议是好的。如果使用指针或数组索引来实现它并不重要;您可以使用阅读器和编写器指针,也可以使用阅读器和编写器索引。

考虑何时想要推进指数。在编写字符后,始终向前移动写入索引。当你读完一个字符时,你可以向前移动读取索引。

也许你可以从一些只是在字符串上移动的代码开始,但实际上并没有改变它。然后你添加跳过额外空格的逻辑。

答案 2 :(得分:1)

char p[] = "this is              a test";
char *readptr = &p[0];
char *writeptr = &p[0];

int inspaces = 0;
while(*readptr) {
 if(isspace(*readptr)) {
   inspaces ++;
 } else {
  inspaces = 0;
 }
 if(inspaces <= 1) {
  *writeptr = *readptr;
   writeptr++;
 }
 readptr++;
}
*writeptr = 0;

答案 3 :(得分:1)

这是一个只有一个循环(没有内循环来跳过空格)而没有状态数据的解决方案:

dm9pZCBTdHJpcFNwYWNlcyAoY2hhciAqdGV4dCkNCnsNCiAgY2hhciAqc3JjID0gdGV4dCwgKmRl
c3QgPSB0ZXh0Ow0KICB3aGlsZSAoKnNyYykNCiAgew0KICAgICpkZXN0ID0gKihzcmMrKyk7DQog
ICAgaWYgKCpzcmMgIT0gJyAnIHx8ICpkZXN0ICE9ICcgJykNCiAgICB7DQogICAgICArK2Rlc3Q7
DQogICAgfQ0KICB9DQogICpkZXN0ID0gMDsNCn0NCg==

以上是Base64编码,因为这是一个家庭作业问题。要进行解码,请复制上面的块并粘贴到this website进行解码(您需要检查“解码”单选按钮)。

答案 4 :(得分:0)

假设您正在尝试编写类似的函数:

void removeSpaces(char * str){

   /* ... stuff that changes the contents of str[] */

}

您希望扫描字符串以查找连续的空格,以便您的写指针始终跟踪您的读指针。将读指针前进到指向空格的位置,但下一个字符不是空格。如果你的读写指针不一样,那么你的写指针应该指向一系列空格的开头。写入和读取指针之间的差异(即read_pointer - write_pointer)将告诉您需要覆盖的连续空格的数量以缩小间隙。当存在大于零的差异时,(前缀)将两个指针前进多个位置,然后复制字符。当你被读取时,指针位于字符串的末尾('\ 0'),你应该完成。

答案 5 :(得分:0)

你能使用正则表达式吗?如果是这样,那可能很容易。使用正则表达式将\s{2,}?替换为单个空格。 \s表示任何空格(制表符,空格,回车符...); {2,}表示2个或更多; ?表示非贪婪。 (免责声明:我的正则表达式可能不是你能写的最好的,因为我不是正则表达式专业版。而且,它是.net语法,因此C语言的正则表达式库可能会略有不同的语法。)

答案 6 :(得分:-1)

你为什么不这样做:

制作第二个char **,其长度与第一个相同。当你用你的指针运行第一个数组时,在你看到的最后一个空格上保留一个额外的指针。如果您看到的最后一个空格是前一个元素,那么您不会将该char复制到第二个数组。

但是我会从每个角色的char **开始,并打印出每个char。如果你能做到这一点,那么你可以将它们真正复制到第二个字符中。