可能重复:
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 :(得分: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';