C++不带split函数,自定义的Split函数
vector<string> split(string str,string delimeter) {
vector<string> res;
char *token;
char *text = (char *)str.c_str();
const char* deli = delimeter.c_str();
token = strtok_s(text, deli, &text);
while (token) {
res.push_back(token);
token = strtok_s(text, deli, &text);
}
return res;
}
关于string的类型转换
数字转为字符串
to_string(val) 把val转换成string
字符串转数字
stoi(s,p,b) 把字符串s从p开始转换成b进制的int
stol(s,p,b) 把字符串s从p开始转换成b进制的long
使用stringsteam库函数
include<stringsteam>
int cc;
string str="12";
stringsteam ss;
ss<<str;
ss>>cc;//将12赋值给cc
字符拼接成字符串,C++中字符不能通过 char_a+""转化为字符串,或者通过to_string('a'),将其转化为字符串。因为编译器会先将‘a’转化为整性97,再把97转为"97"
include<stringsteam>
char a='a',b='b';
string str;
stringsteam ss;
ss<<a<<b;
ss>>str;//将"ab"赋值给str
string转为char*
char* p = str.c_str();
char*转string
string here = chararray;
const char*和char*的互相转换
const char* pp=”aa”;
char* qq = const_cast<char*>(pp);
const char* oo = const_cast<const char*>(qq);
还有一些string库自带的函数
索引函数str.find(string guanjianzi, int start);
截断函数str.substr(int start,int end);
比较函数strcmp(string first,string second);
判断字符为字母数字等:
Isalnum(char a) 当字母或数字字符时, 返回真值
Isdigit(char a) 当数字字符时, 返回真值
Isxdigit(char a)当16进制字符时,返回真a-f,A-F,0-9
Isalpha(char a) 当字母字符时, 返回真值
Issupper(char a)当大写字母时,返回真
Islower(char a) 当小写字母时,返回真
Isspace(char a) 当空格时返回真
经典KMP算法:
#include<iostream>
using namespace std;
//根据前一个字母判断后一个字母的对应位置
void getText(string t, int next[]) {
next[0] = -1;
int k = -1;
int i = 0;
while(i < t.length()-1) {
if (k == -1 || t[i] == t[k]) {
i++;
k++;
next[i] = k;
}
else {
k = next[k];
}
}
}
//母串s中搜索字串t
int kmp(string s,string t) {
int text[100];
getText(t, text);
int i = 0, j = 0;
int slength = s.length();
int tlength = t.length();
while ((i < slength) && (j < tlength)) {
if (j==-1 || s[i] == t[j]) {
i++;
j++;
}
else {
j = text[j];
}
}
if (j >= t.length()) {
return (i - t.length());
}
return -1;
}
提供模式串一个
字串 |
a |
b |
c |
a |
b |
b |
a |
b |
c |
Text |
-1 |
0 |
0 |
0 |
1 |
2 |
0 |
1 |
2 |
Char数组中结尾自动包含一个空格,所以它的长度会多一个。但是用strlen求得的长度相同。string不同,长度就是字符个数。数组通过sizeof求长度