void r(char *str)
{
char *new = str;
while (*str != '\0') {
if (*str != ' ') *(new++) = *str;
str++;
}
*new = '\0';
}
我有这个功能,但我不理解if语句之后的代码。如果有人能向我解释,我将不胜感激。
答案 0 :(得分:9)
此函数正在从传入的值str
中删除空格。
*(new++) = *str;
表示将指针指向new并取消引用它,以便我们可以使用它来存储它所指向的记忆位置。然后取str指向的值,并将其取消引用它指向的char。将该char分配给new所在的位置,然后将新指针移动到下一个位置。最后,如果str指针值是空格,则始终将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循环和数组索引而不是指针数学。
答案 1 :(得分:4)
该函数正在移除空格(就地) - 它将除空格之外的所有内容复制到与之前相同的字符串。
所以if语句说:“如果str中的字符不是空格,则将其复制到new”(与str在同一内存区域,但是当str遇到空格时会开始跟踪)
请注意str总是递增,但new只在复制字符时递增。所以str会扫描整个字符串,但数据会被复制到字符串的前面,因为当有空格时new不会更新。
然后最后在new处添加一个终止空值,以便缩短的版本正确终止。
答案 2 :(得分:1)
这个版本的程序(K& R样式!)更短,也是如此:
void r(char *str)
{
char *new;
for (new=str; *new = *str++; ) {
if (*new != ' ') new++;
}
}
答案 3 :(得分:0)
while (*str != '\0') {
if (*str != ' ') *(new++) = *str;
str++;
}
相当于:
while (*str != '\0') {
if (*str != ' ') {
*new = *str;
new++;
}
str++;
}