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