2017-03-03 196 views
0

我试图从一个从txt文件读取的大型数组中删除空格。 我要处理的数组的strlen()大约是15,000〜22,500。C - 删除空格

这里是我的代码:

#include <stdio.h> 
#include <ctype.h> 

void whiteSpace(char str[]){ 
    int i, j; 
    for (i = 0; str[i] != 0; i ++){ 
     if (isspace(str[i])){ 
      for(j = i; str[j] != 0; j ++){ 
       str[j] = str[j + 1]; 
      } 
     } 
    } 
} 

这适用于短数组,但对于更大的阵列,我必须使用空格(),如两次摆脱所有的白色空间?我认为算法是正确的,我不知道为什么它适用于短阵列和大型(15,000〜22,500)阵列的毛刺,除非我调用函数两次或三次。

谢谢。

+0

考虑动态内存allocation.malloc这样更大的存储的东西 – minigeek

+1

[删除空间从C中的字符串?](http://stackoverflow.com/questions/1726302/removing-spaces-from-a-string-in- c) – BLUEPIXY

回答

2

对于小型阵列来说它不能正常工作。如果你连续有两个空格,它将会出错。

问题是,当它跳过一个空格时,它从不检查转移的字符是否也是空格。

有几种方法可以解决它。最简单但不是最好的方法是将if更改为while

+1

谢谢,你是正确的... – Paul

1

这是关于可以完成您的任务的最低效方式,但您看到的特定问题是由连续多个空格造成的。想象一下,你在i循环中扫描,你会看到两个空格中的第一个。因此,您启动j循环,将数组中的所有内容都移动一个字符靠近开头。你移动的第一个字符是第二个空格,并且你把它放在第一个空格的位置。最后,你完成移动,i前进到下一个角色 - 这是你移动到第一个空间的第二个空间。现在缓冲区中剩下一个空间,但i正在指向它,所以它会被留下。

+0

什么是最有效的方式摆脱阵列中的所有空白? – Paul

+2

一种方法是让两个索引('get'和'put')在数组中向前移动。如果它们不相等,则将'str [get]'复制到'str [put]'中。如果'str [get]'是一个空格,那么你增加'get'(但不要复制)。这样,所有不是空间的东西都会挤到阵列的前面。 –

+0

非常感谢! – Paul