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\n", buf);

sscanf(buf, "%[0-9].%[0-9].%[0-9].%[0-9]", a,b,c,d);
printf("%s,%s,%s,%s\n", 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

trim字符串前后的空格:

std::string &CAuthorizer::trim(std::string &str)
{
// 方法1 str.erase(
0, str.find_first_of(' ')); str.erase(str.find_last_of(' ') + 1); return str;    // 方法2 str.erase(std::remove_if(str.begin(), str.end(), [](char ch) { return !std::isdigit(ch); }), str.end()); return str; }

 

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);

6.大小写转换

std::transform(html_msg.begin(), html_msg.end(), html_msg.begin(), tolower);

 

7. 终端内输出同一行

  参考

8. Linux常用工具的源码

  参考    参考

 

posted @ 2019-08-14 10:22  AlexOne  阅读(328)  评论(0编辑  收藏  举报