学过C语言或者C++可以指导,我们可以对字符串进行许多操作,有一点值得注意的时,C字符串需要以\0结尾,使用时也需要我们注意防止溢出。
在这上面的内容中、重头戏在于串的定位,即我们后面要求的子串搜索算法。
在此先大致了解其他操作
无论C还是C++的字符串初始化与赋值都有多种方式,我们先了解最常用的方式即可,有兴趣可以去学习C++
//main1.cpp
#include <iostream>
#include <string>
#include <cstring>
int main(int argc, char **argv)
{
std::string str1 = "hello";
char str2[512] = "hello";
// str2 = "jij"; error:str2不是左值
// 如果数组性字符串想要重新赋值则通常用strcpy
(str2, "gaowanlu");
strcpyconst char *str3 = "hello";
std::cout << str1 << std::endl; // hello
std::cout << str2 << std::endl; // gaowanlu
std::cout << str3 << std::endl; // hello
return 0;
}
//main2.cpp
#include <iostream>
#include <string>
#include <cstring>
int main(int argc, char **argv)
{
// C语言
char str1[512] = "ndsjkc";
char str2[512];
(str2, str1);
strcpystd::cout << str2 << std::endl; // ndsjkc
// C++
std::string str3 = "ndsjkc";
std::string str4 = str3; // copy assign
std::cout << str4 << std::endl; // ndsjkc
return 0;
}
当然除了下面这些,还有很多中方式,但都是通过字符串的长度来进行判断的。
//main3.cpp
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
= "io";
string str1 const char *str2 = "io";
// str1 false
<< "str1 " << (str1.empty() == true ? "true" : "false") << endl;
cout // str2 false
<< "str2 " << (strlen(str2) == 0 ? "true" : "false") << endl;
cout return 0;
}
通常为字典比较
//main4.cpp
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
const char *str1 = "nihoa";
const char *str2 = "nihoa";
= "ab";
string str3 = "a";
string str4 << strcmp(str1, str2) << endl; // 0 则代表相等 1则str1>str2 -1 则str<str2
cout << (str3 == str4) << endl; // 0
cout << (str3 < str4) << endl; // 0
cout << (str3 > str4) << endl; // 1
cout << strcmp(str3.c_str(), str4.c_str()) << endl; // 1
cout return 0;
}
std::string一般使用length()或者size()方法,C使用strlen
//main5.cpp
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
const char *str1 = "nihoa";
char str2[512] = "vbdhfj";
<< strlen(str1) << endl; // 5
cout << strlen(str2) << endl; // 6
cout = "hello";
string str3 << str3.size() << endl; // 5
cout << str3.length() << endl; // 5
cout return 0;
}
就是截取字符串的一部分.
//main6.cpp
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
const char *str1 = "1234567";
char str2[10];
//从下标3向后截取2个字节
(str2, str1 + 3, sizeof(char) * 2);
memcpy[2] = '\0';
str2<< str2 << endl; // 45
cout
std::string str3 = "1234567";
std::string str4 = str3.substr(3, 2);
<< str4 << endl; // 45
cout return 0;
}
就是字符串的拼接.
//main7.cpp
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
char str1[512] = "nihao";
const char *str2 = "tail";
(str1, str2);
strcat<< str1 << endl; // nihaotail
cout
std::string str3 = "nihao";
std::string str4 = "tail";
+= str4;
str3 << str3 << endl; // nihaotail
cout return 0;
}
就是在字符串中搜索字串了,现在有很多算法提供我们学习,在基础的书籍内有两种一种是暴力搜索,一种是KMP算法。
清空就显得很容易了
//main8.cpp
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
char str1[10] = "nihao";
char str2[10] = "tail";
<< str1 << endl; // nihao
cout << str2 << endl; // tail
cout [0] = '\0';
str1[0] = '\0';
str2<< str1 << endl; //
cout << str2 << endl; //
cout return 0;
}
字符串的销毁一般都是释放申请的堆内存而言的,因为栈内存是连着我们的执行上下文的。
//main9.cpp
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
= "fdvdf";
string str1 << str1 << endl; // fdvdf
cout .clear();
str1
char *str2 = new char[512];
(str2,"dsfv");
strcpy<< str2 << endl; // dsfv
cout delete str2;
return 0;
}