现在情况是,在现有的待处理字符串中,中间,左边,右边可能都会有空格。
1 //去字符串中的空格,只去左空格,只去右空格,去全部空格。 2 #include <stdio.h> 3 4 /*只去除右边空格*/ 5 6 void trimStrRightSpace(char *str) 7 { 8 #if 0 //思路:先移动到末尾,再往左遍历,直到遇到非空格为止。再回退一次,置个0 9 while(*str) 10 str++; 11 while(*(--str) == ' '); 12 *(++str) = '\0'; 13 #endif 14 15 #if 1//思路:先移动到末尾,再往左遍历,碰见的空格全部置0,直到碰见非空格为止。 16 while(*str) 17 str++; 18 while(*(--str) == ' ') 19 *str = '\0'; 20 #endif 21 } 22 23 24 25 26 27 /*只去除左边空格,去空格的同时需要用后边的有效字符把空格覆盖*/ 28 //基础版 29 void trimStrLeftSpace1(char *str) 30 { 31 //一个指针先移动到非空格, 然后依次把非空格字符拷贝移动到左边,包括\0 32 char* p = str; 33 while(*p == ' ') 34 p++; 35 while(*str++ = *p++); 36 } 37 //如果本来就没空格,上面的代码那就是瞎拷贝一次浪费时间。 38 39 //优化版 如果左边没空格则不不进行无意义的拷贝操作, 40 void trimStrLeftSpace2(char *str) 41 { 42 if(*str != ' ') 43 return; 44 45 char* p = str; 46 while(*p == ' ') 47 p++; 48 while(*str++ = *p++); 49 } 50 51 52 53 54 55 56 /*去除全部空格*/ //1和2逻辑一样,只是变形,2更好 57 //等于空格时,s不动,p往前走 58 //不等于空格时,拷贝,s往前走,p往前走 59 void trimStrAllSpace1(char* str) 60 { 61 char* p = str; 62 while(*p) 63 { 64 if(*p == ' ') 65 { 66 p++; 67 68 } 69 else 70 { 71 *str = *p; 72 p++; 73 str++; 74 } 75 } 76 *str = '\0'; 77 } 78 //p碰到非空格,进行拷贝 79 //p碰见空格,越过 80 void trimStrAllSpace2(char* str) 81 { 82 char* p = str; 83 while(*p) 84 { 85 if(*p != ' ') 86 *str++ = *p; 87 p++; 88 } 89 *str ='\0'; 90 } 91 92 93 94 int main(void) 95 { 96 char str[] = " ab c de "; 97 // trimStrRightSpace(str); 98 // trimStrLeftSpace2(str); 99 trimStrAllSpace1(str); 100 printf("|%s|\n",str); 101 return 0; 102 }