2011-08-23 346 views
0

可能重複:
How do I trim leading/trailing whitespace in a standard way?去掉空格

我需要從開始和字符串實例的結尾刪除所有空格,如果我的字符串

"  hello  world.  " 

(不帶引號),我需要打印

"hello  world." 

我想是這樣的:

size_t length = strlen (str); 
for (newstr = str; *newstr; newstr++, length--) { 
    while (isspace (*newstr)) 
     memmove (newstr, newstr + 1, length--); 

但它刪除所有空格。

我該如何解決?

+0

的可能的複製http://stackoverflow.com/questions/122616/painless-way-to-trim-leading-trailing-whitespace-in-c和http://stackoverflow.com/questions/656542/trim-a-string-in-c – lhf

+0

這是功課嗎? –

+0

請參閱此SO問題的答案:http://stackoverflow.com/questions/122616/painless-way-to-trim-leading-trailing-whitespace-in-c –

回答

3

不需要移動。從起點開始(掃描直到第一個非空格字符)。然後,從後面開始工作,找到第一個非空白字符。向前移動一個,然後替換爲空終止符。

char *s = str; 
while(isspace(*s)) ++s; 
char *t = str + strlen(str); 
while(isspace(*--t)); 
*++t = '\0'; 
+0

太聰明太棒了! – user123

6

跳過開頭的空間與while(isspace(...)),然後memmove從你到達開始位置的字符串(您也可以手動執行memmove工作,兩個指針的經典的「絕招」,一個用於讀一個用於寫入)。

You start from 

[ ][ ][H][e][l][l][o][ ][W][o][r][l][d][ ][ ][\0] 
^ 

[ ][ ][H][e][l][l][o][ ][W][o][r][l][d][ ][ ][\0] 
    ^skipping the two spaces you move your pointer here 

... and with a memmove you have... 
[H][e][l][l][o][ ][W][o][r][l][d][ ][ ][\0] 

然後,在字符串的結尾移動鼠標指針(你可以幫自己一個strlen),和倒退,直到找到一個非空字符。將它後面的字符設置爲0,並且您只需將字符串末尾的空格剪掉即可。

         v start from the end of the string 
[H][e][l][l][o][ ][W][o][r][l][d][ ][ ][\0] 

... move backwards until you find a non-space character... 
           v 
[H][e][l][l][o][ ][W][o][r][l][d][ ][ ][\0] 

.... set the character after it to 0 (i.e. '\0') 

[H][e][l][l][o][ ][W][o][r][l][d][\0] 

... profit!