C中的空白空间

问题描述:

void empty_spaces(char array[]){ 
int j=0,i=0,n=0; 
n=strlen(array); 
while(i<n){ 
    if(array[i]==' '){ 
     j=i; 
     while(j<n){ 
      array[j]=array[j+1]; 
      ++j; 
     } 
     --n; 
    }else 
     ++i; 
} 
if(n>15) 
     n=15; 
array[n]='\0'; 
} 

有人可以解释我,这段代码吗?这个函数清理数组中的空白空间,但是有人能够解释它到底是什么工作吗?C中的空白空间

+3

好吧,你总是可以在调试器中运行它,并逐步了解它的含义。之后,您可以回到这里,回答一个具体的问题...... – 2011-12-17 22:38:36

+1

这段代码中您的混淆源究竟是什么? – Lion 2011-12-17 22:39:05

+0

它似乎压缩所有的空白。然后截断数组的长度为15. – 2011-12-17 22:39:48

它遍历数组中的每个字符,删除所有''(空格)字符。内循环是什么擦除。当外部循环找到一个空格字符时,内部循环将数组的其余部分“移动”到左边的一个索引处,覆盖空间。

基本上,一旦循环遇到' '字符(空格),它将数组中的所有元素都移动到“左”位置,因此用下列字符替换空格。

+0

请在你的回答中更具描述性。并且通常提供示例代码。 – 2018-01-27 08:07:09

这是一个相当松弛的尝试,在一个函数中删除字符串中的空格。代码的问题是它有无偿迭代,它将O(n)算法变成O(n^2)算法。

与其试图理解你所拥有的代码,我觉得最好是以高效和简单的方式来完成它。喜欢这个。

void empty_spaces(char str[]) 
{ 
    char *src = str; 
    char *dst = str; 

    while (*src) 
    { 
     if (*src != ' ') 
     { 
      *dst = *src; 
      dst++; 
     } 
     src++; 
    } 
    *dst = '\0'; 
} 

我们进行整个字符串中的一个通带两个指针,srcdst。遇到非空格字符时,它将从源复制到目标。在数组中维护两个单独的指针避免了代码中的虚假迭代。

我忽略了n>15部分代码。这样做的效果是字符串总是被截断为长度不超过15个字符,但是为什么这样做对我来说是神秘的。这个功能当然不应该混淆在一起。

由于我没有真正回答这个问题,但因为我希望这对你有用,所以我做了答案社区wiki。

+0

'while(src)',你确定吗? :p – fge 2011-12-17 22:43:27

+0

不回答问题,但“*此答案很有用*”:-) – cnicutar 2011-12-17 22:43:41

+0

@fge非常感谢。我头脑中的编译和测试失败了! – 2011-12-17 22:45:43

重写和上述的注释版本:

//.... 
n = strlen(array); // n is the number of characters in the array up to the final 0 
while (i < n) { 
    if (array[i] != ' ') { // not a space 
     i++;    // next char, 
     continue;   // continue 
    } 

    j = i; // j is the current array index 

    while (j < n) {  // while there are chars left... 
     array[j] = array[j+1]; // copy the next character into the current index 
     j++; 
    } 
    n--;     // and remove one from the string len since a space is removed 
} 

返回之前限制所述字符串长度15后的代码。

因此,此代码删除空格可能会截断字符串为15个字符只。