void r(char *str)
{
char *new = str;
while (*str != '\0') {
if (*str != ' ') *(new++) = *str;
str++;
}
*new = '\0';
}
我有這個功能,但我不明白後if語句的代碼。我會很感激,如果有人能解釋給我。奇怪的指針功能
void r(char *str)
{
char *new = str;
while (*str != '\0') {
if (*str != ' ') *(new++) = *str;
str++;
}
*new = '\0';
}
我有這個功能,但我不明白後if語句的代碼。我會很感激,如果有人能解釋給我。奇怪的指針功能
此功能將剝離傳入值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循環和數組索引,代替指針數學。
非常感謝我的基本問題是完全在「if」之後的聲明中。現在結合上面的答案完全清楚:) – user2154323
該函數將刪除空格(就地) - 它將所有空格都複製到與之前相同的字符串中。
所以if語句是這樣說的:「如果str中的字符不是空格,則將其複製到新的」(與str相同的內存區域,但當str滿足空格時會開始落後)。
請注意str是如何增加的,但是隻有在複製一個字符時纔會增加新值。所以str掃描整個字符串,但數據被複制到字符串中的較早部分,因爲當有空格時新不會更新。
然後最後在新添加一個終止空值,以便縮短版本正確終止。
非常感謝一步一步的解釋:) – user2154323
此版本的程序(!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++;
}
那是可變的真名叫'新'? – Paulpro
是的...從if語句我可以看出,它顯然做了一些與空間,但不能繼續。 – user2154323
@Paulpro:爲什麼不把它命名爲'new'? :)猜猜'sizeof('\ 0')'是什麼! – 2013-05-29 15:49:00