2
void r(char *str) 
{
    char *new = str;
    while (*str != '\0') {
        if (*str != ' ') *(new++) = *str;
        str++;
    }
    *new = '\0';
}   

我有这个功能,但我不明白 if 语句之后的代码。如果有人能向我解释一下,我将不胜感激。

4

4 回答 4

9

此函数从传入的 value 中删除空格str

*(new++) = *str;意味着获取指向字符串 new 的指针并取消引用它,以便我们可以使用它来存储它在内存中指向的位置。然后取 str 指向的值并将其取消引用到它指向的 char 。将该 char 分配到 new 所在的位置,然后将 new 指针移动到下一个位置。最后,始终移动 str 指针以及它的str++值是否为空格。

如果这样写,您可能会更清楚:

void r(char *str) 
{
    char *new = str;
    int newStringIndex = 0;

    for(int i=0; str[i] != '\0'; i++)
    {
         if (str[i] != ' ') 
         {
             new[newStringIndex++] = str[i];
         }
    }

    new[newStringIndex] = '\0';
} 

相同的代码功能,但使用 for 循环和数组索引而不是指针数学。

于 2013-05-29T15:46:51.550 回答
4

该函数正在删除空格(就地)-它将除空格之外的所有内容复制到与以前相同的字符串中。

所以 if 语句是说:“如果 str 中的字符不是空格,则将其复制到新的”(与 str 位于同一内存区域,但当 str 遇到空格时将开始落后)。

请注意 str 如何始终递增,但 new 仅在复制字符时递增。所以 str 扫描整个字符串,但是数据被复制到字符串的前面,因为当有空格时 new 不会更新。

然后最后在 new 处添加一个终止的 null ,以便缩短的版本正确终止。

于 2013-05-29T15:46:41.690 回答
1

这个版本的程序(K&R 风格!)更短并且功能相同:

void r(char *str) 
{
    char *new;
    for (new=str; *new = *str++; ) {
        if (*new != ' ') new++;
    }
}  
于 2013-05-29T16:09:26.197 回答
0
while (*str != '\0') {
    if (*str != ' ') *(new++) = *str;
    str++;
}

相当于:

while (*str != '\0') {
    if (*str != ' ') {
        *new = *str;
        new++;
    }
    str++;
}
于 2013-05-29T16:18:44.473 回答