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';
}
有人可以解释一下,这段代码?这个函数清理数组中的空格,但是有人可以解释一下它的确切作用吗?
答案 0 :(得分:5)
对于从字符串中删除空格的函数来说,这是一次相当松散的尝试。代码的问题在于它有无偿迭代,它将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';
}
我们使用两个指针src
和dst
对字符串执行单次传递。遇到非空格字符时,会将其从源复制到目标。将两个单独的指针保持在数组中可以避免代码中的虚假迭代。
我忽略了代码的n>15
部分。这样做的结果是字符串总是被截断为长度不超过15个字符,但是为什么这样做对我来说是神秘的。肯定不应该混淆这个功能。
由于我没有按照要求回答问题,但由于我希望这对你有用,我已经回答了社区维基。
答案 1 :(得分:1)
以上的重写和评论版本:
//....
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个字符。
答案 2 :(得分:0)
它遍历数组中的每个字符,删除所有''(空格)字符。内循环是擦除的内容。当外循环找到一个空格字符时,内循环将数组的其余部分“移动”到左边的一个索引,覆盖空格。
答案 3 :(得分:-1)
基本上,一旦循环遇到' '
字符(空格),它就会将数组的所有元素移动到一个“左”的位置,因此用以下字符替换空格。