2013-05-29 163 views
2
void r(char *str) 
{ 
    char *new = str; 
    while (*str != '\0') { 
     if (*str != ' ') *(new++) = *str; 
     str++; 
    } 
    *new = '\0'; 
} 

我有這個功能,但我不明白後if語句的代碼。我會很感激,如果有人能解釋給我。奇怪的指針功能

+0

那是可變的真名叫'新'? – Paulpro

+0

是的...從if語句我可以看出,它顯然做了一些與空間,但不能繼續。 – user2154323

+1

@Paulpro:爲什麼不把它命名爲'new'? :)猜猜'sizeof('\ 0')'是什麼! – 2013-05-29 15:49:00

回答

9

此功能將剝離傳入值str以外的空格。

*(new++) = *str;表示將指針指向字符串new並將其解除引用,以便我們可以使用它來存儲它指向的memeory中的位置。然後取出str指向的值並將其解引用到它指向的字符處。將該char分配到新的位置,然後將新指針移動到下一個位置。最後,如果值是空格,總是將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循環和數組索引,代替指針數學。

+0

非常感謝我的基本問題是完全在「if」之後的聲明中。現在結合上面的答案完全清楚:) – user2154323

4

該函數將刪除空格(就地) - 它將所有空格都複製到與之前相同的字符串中。

所以if語句是這樣說的:「如果str中的字符不是空格,則將其複製到新的」(與str相同的內存區域,但當str滿足空格時會開始落後)。

請注意str是如何增加的,但是隻有在複製一個字符時纔會增加新值。所以str掃描整個字符串,但數據被複制到字符串中的較早部分,因爲當有空格時新不會更新。

然後最後在新添加一個終止空值,以便縮短版本正確終止。

+0

非常感謝一步一步的解釋:) – user2154323

1

此版本的程序(!k來& [R風格)是短,做同樣的:

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

等同於:

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