60. 去字符串中的空格,去左空格,去右空格,去全部空格。

现在情况是,在现有的待处理字符串中,中间,左边,右边可能都会有空格。

  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 }

 

转载于:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9555946.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值