void r(char *str)
{
char *new = str;
while (*str != '\0') {
if (*str != ' ') *(new++) = *str;
str++;
}
*new = '\0';
}
我有这个功能,但我不明白 if 语句之后的代码。如果有人能向我解释一下,我将不胜感激。
此函数从传入的 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 循环和数组索引而不是指针数学。
该函数正在删除空格(就地)-它将除空格之外的所有内容复制到与以前相同的字符串中。
所以 if 语句是说:“如果 str 中的字符不是空格,则将其复制到新的”(与 str 位于同一内存区域,但当 str 遇到空格时将开始落后)。
请注意 str 如何始终递增,但 new 仅在复制字符时递增。所以 str 扫描整个字符串,但是数据被复制到字符串的前面,因为当有空格时 new 不会更新。
然后最后在 new 处添加一个终止的 null ,以便缩短的版本正确终止。
这个版本的程序(K&R 风格!)更短并且功能相同:
void r(char *str)
{
char *new;
for (new=str; *new = *str++; ) {
if (*new != ' ') new++;
}
}
while (*str != '\0') {
if (*str != ' ') *(new++) = *str;
str++;
}
相当于:
while (*str != '\0') {
if (*str != ' ') {
*new = *str;
new++;
}
str++;
}