• C/C++处理字符串


    1. strtok

      函数原型:char * strtok(char *str, const char * delim);

      注意点:

        两个入参必须为字符串数组;

        第一次调用要传str, delim,后面调用要传NULL, delim,传入其它的str后重新被初始化,内部是一个static的指针;

        与之相对的一个:strtok_r();

      典型逻辑:

    while(result = strtok(input, split))
    {
        input = NULL;
    
        if(i == 0)
        {
        }
    
        if(i == 1)
        {
        }
    
        i++;
    }

      处理空格:

    std:string name = "aaa     bbbb ccc  ";
    int fpos=0,epos=fpos;
    while((fpos=name.find_first_of(" ", epos)) != std::string::npos)
    {
        if(fpos != epos)
        {
             std::cout << name.substr(epos, fpos-epos) << std::endl;
        }
        epos = ++fpos;
        // break;
    }

    2. sprintf、sscanf

      函数原型:

        int sprintf(char *str, const char *format, ...);

        int sscanf(const char *str, const char *format);

      用于版本号、IP等的匹配,%后面的可以用正则表达式,灵活性较强,要处理简单字符串的时候可以考虑替代使用regex.h库。

    char buf[16]="10.150.88.34";
    char a[4]="192",b[4]="168",c[4]="0",d[4]="1";
    
    //sprintf(buf, "%s.%s.%s.%s", a,b,c,d);
    //printf("%s
    ", buf);
    
    sscanf(buf, "%[0-9].%[0-9].%[0-9].%[0-9]", a,b,c,d);
    printf("%s,%s,%s,%s
    ", a,b,c,d);

      更深入细致的介绍:

        参考  参考   可以使用更安全的stringstream,与getline连用:参考

        C语言字符匹配系统介绍:参考

    3. 补充C++

      常用的算法总结:参考   参考

        regex_replace、replace_if、remove_copy_if、remove_if、find_if

        adjacent_find、all_of、find_end(搜索集合最后出现的位置)includes(搜索交集)

    string str1 = "Text with some   spaces";
    str1.erase(std::remove(str1.begin(), str1.end(), ' '),  str1.end());  // "Textwithsomespaces"
    
    str1.erase(std::remove_if(str1.begin(), str1.end(), isdigit),  str1.end());  // "Textwithsomespaces"
    std::remove_copy_if(a.begin(),a.end(),b.begin(), isdigit); //删除数组,b可以是a

      remove_copy_if也能完成上述过程:参考   参考

      remove_if,不能用于map或set

    4. 获取字符串中的数字

    std::string s("xxxx 111 sssss"), ss;
    std::string::iterator ps=ps.begin();
    
    while((ps = std::find_if(ps, s.end, isdigit)) != s.end())
    {
        ss+=*ps++;
    }
    
    std::cout << ss << std::endl;

     5. 字符串进制转换

       参考

    #include <cstdlib>
    int a=10;
    char str[]="100";
    char *buf;
    long ret = strtol(str, &buf, 10);  // 第三位代表了进制,10进制,二进制等,随便填,返回结果,buf指针就像是strtok里面的那个看不见的静态指针,用于记录位置。
    
    atoi(str);
  • 相关阅读:
    【Oracle】外部程序连接Oracle库之前的准备工作
    【Oracle】ora-12514的问题的解决
    Java8 LocalTime处理小结
    No serializer found for class com.hy.myapp.rest.VarietyInfo and no properties discovered to create BeanSerializer
    【Design Pattern】将职责链模式应用到Rest服务中去
    大商所交易品种和交易时间
    【RestTemplate】post请求示例
    【Pyton】访问Java提供的Rest接口示例
    【RestController】Restful接口获取请求者IP地址
    [HTML]锚点定义,链接跳转到锚点,JS跳转到锚点
  • 原文地址:https://www.cnblogs.com/abnk/p/11350280.html
Copyright © 2020-2023  润新知