从C中删除字符串中的空格

时间:2011-08-23 00:09:55

标签: c string

  

可能重复:
  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--);

但它删除了所有空格。

我该如何解决?

2 个答案:

答案 0 :(得分: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,然后vo,你只需要剪掉字符串末尾的空格。

                                     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!

答案 1 :(得分:3)

无需记忆。从起点开始(扫描直到第一个非空格字符)。然后,从后面开始工作,找到第一个非空格字符。向前移动一个然后用空终止字符替换。

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