C++中string的split拆分函数,kmp算法程序以及其它常用函数

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求长度

 

 

 

发布了10 篇原创文章 · 获赞 3 · 访问量 298

猜你喜欢

转载自blog.csdn.net/qq_32227619/article/details/105559855