• 删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为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;
        }

    花花的代码几乎已经到极致了,不过不确定是否一定就是正确的,暂时只发现了一点点小问题:就是都为空格的时候不行,不过经过改进,现在的代码应该是没有问题了。

    基本思路: 指针

    需要两个指针, 首先除去开头的空格,这个相信大家都没有任何问题,这时字符串已经变为  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. GP大神的代码

    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';
            }
        }
    }
  • 相关阅读:
    MSSQL的基础应用
    SQLLite的使用
    C#反射调用其它DLL的委托事件 传值
    SQLServer 取 字段名称 类型 字段描述 等
    WCF跨域 客户端无法访问
    不同的数据库数据类型映射
    用人四策
    思考集体跳槽
    C/C++/Qt 统计运行时间
    CUDA项目属性设置
  • 原文地址:https://www.cnblogs.com/itachi7/p/2703118.html
Copyright © 2020-2023  润新知