删除字符串开始和结尾空格,并将中间多个空格合并为一个空格

来源:互联网 发布:淘宝卖干果有什么要求 编辑:程序博客网 时间:2024/04/29 16:21

1.常规解法:

int trim(char* str){    int count = 0;    char* p = str;    bool first = true;    while(*str != '\0' && *str == ' '){        count++;        str++;        }        if(*str == '\0'){            *p = '\0';            return count;            }                while(*str != '\0'){        while(*str != '\0' && *str != ' '){            *p++ = *str++;            }        if(*str == '\0')break;            *p++ = *str++;              while(*str != '\0' && *str == ' '){                      count++;                        str++;                           }        }        if(*(p-1) == ' '){            p--;            count++;            }        *p = '\0';    return count;    }

2.需要两个指针, 首先除去开头的空格,这个相信大家都没有任何问题,这时字符串已经变为  a*****  这种形式了;

难度就在于,在这之后出现的空格,不能全部除去,需要保留一个。

void tri(char* p,char k){        assert(p);    char* s1 = p;    char* s2 = p;    while (*s2&&*s2 == k)        //先去掉开始的空格        ++s2;    *s1 = *s2;    if (*s2 == '\0')               //若为全空格字符串        return;    while (*(++s2) != '\0')    {        if (*s2 != k||*s1 != k)   //核心:(<a,a>||<_,a>)s2为字符 一定要复制   <a,_> s2为空格 s1为字符 代表为首次出现空格 要复制        {            *(++s1) = *s2;        }    }    if (*s1 == k)     // 消除最后一个空格                     *s1 = '\0';    else        *(++s1) = '\0';}  


 

3. 更优解

void trim_str(char *str){    assert(str);{        int s_len = strlen(str);        if(s_len>0){            char *s_b = str,                *s_e = str+s_len,                *s_copy = str;            for( ; s_b!=s_e && *s_b==' '; ++s_b);            while(1){                for( ; s_b!=s_e && *s_b!=' '; ++s_b)                    *s_copy++ = *s_b;                if(s_b==s_e)                    break;                *s_copy++ = *s_b++;                for( ; s_b!=s_e && *s_b==' '; ++s_b);                if(s_b==s_e){                    --s_copy;                    break;                }            }            *s_copy = '\0';        }    }}


0 0
原创粉丝点击