字串空格替換或刪除

2021-07-16 16:18:22 字數 1724 閱讀 7544

1.將乙個字串裡面的空格替換成%20,不考慮字元陣列大小溢位,不得使用庫函式

2.將乙個字串裡面的乙個或多個空格替換成乙個空格

這兩道題都是關於字串替換,不同的是第一道題是將乙個空格替換為3個字元%20,當然這裡任意3個字元都可以,而且只要保證陣列大小足夠大,乙個空格替換成多個也無所謂,本質上是將乙個字元替換成多個字元從而增加原字元的長度。

而第二個的話則是將多個字元(只不過是相同的)替換成乙個字元,從而減小原字串的長度。

對於第一道題,可以這麼考慮,先遍歷字串求取原來的字串長度oldlen和空格個數blanknum,由題可知每多乙個空格字串長度就增加(3-1)個即新字串的長度newlen=oldlen+2*blanknum,最後將原來的字串自後向前拷貝到新的空間,如圖所示,以hi usa為例。

**如下:

void replaceblank(char *str)

//oldlen = p - str;

while (str[oldlen] != '\0')

newlen = oldlen + 2 * blanknum;

while (newlen >= 0)

else

str[newlen--] = str[oldlen--];

}}

對於第二題,我自己是這麼考慮的,還是遍歷整個字串,在遍歷的過程中遇到非空格指標string++,遇到第乙個空格的時候不管還是string++, 直到遇到第二個空格記下第二個空格的位置p=string,然後string指標繼續走看是否還有連續的空格直到遇到非空格,此時string指標指向非空格的位置,然後將string及以後字串拷貝到p以後位置,如圖所示

(即字串is a  man\0整體向前移動一位)。

那麼為什麼還要設定乙個q指標來儲存遇到第二個空格時候string的位置呢?

那是因為在拷貝的時候*p++=*string++指標p和string位置都變化了,需要有個q指標儲存之前的位置從而string好定位,來繼續執行迴圈。(移動完字串如下圖)

**如下

void deblank(char *string)

else

else if (flag == 1)

*p = '\0';

//兩種拷貝字串的方法

//while (*p++ = *string++)

// ;

string = q;

}} }

}

c和指標書上給出另一種實現方式,設定兩個指標src和dst,讓src先走,執行src向dst的拷貝,遇到非空格直接拷貝,遇到空格看前面乙個是否是空格,如果不是就拷貝否則就不操作。

**如下

int is_white(int ch) 

void deblank(char *string)

} else

} *dst = '\0';

}

字串替換空格

點 抽象問題簡化問題 題意 乙個字串,比如 aaa baea erwe dsa dsa f a 替換其中的空格字元為 20 劍指offer面試題4 思路 這個問題的點在於,如果正常從頭到尾替換的話,每乙個被替換空格,它後面的全部字串都需要做整體移動 所以要設法想出,怎麼能夠減少字串移動 非空格字元需...

替換空格(字串)

思路一 利用string類的replaceall方法 public class solution 思路二 將字串轉換為字元陣列 建立乙個新的stringbuffer的物件,遍歷字元陣列,將不為空格的字元直接存入 當遇到空格時,存入 20 public class solution return st...

字串 替換空格

方法 從後往前替換,先求出字串總長度 空格數 新字串長度,然後兩個指標分別指向原始字串末尾和新字串末尾,依次替換,遇到空格時則替換為 0 2 include includevoid replaceblank char string,int length int newlength originall...