1、字符串的基本用法
/*
字符串的基本用法主要是指字符串类对象的定义与初始化方法。
*/ #include
int main(int argc, const char * argv[])
{
// 在栈上定义了一个空的字符串对象;
std::string str;
// 在栈上定义了一个字符串对象,然后调用构造函数对其进行初始化。
std::string str1(“Hello World!”);
// 在堆中实例化字符串类,然后用字符串指针指向它。
std::string *pstr = new std::string;
std::string *pstr1 = new std::string();
std::string *pstr2 = new std::string(“Hello World!”);
// 将一个C语言的字符串直接赋值给一个C++的字符串。
std::string str4 = “Hello World!”;
// 将一个字符指针或一个字符数组赋值给一个C++的字符串。
char const pc = “Hello World!”;
std::string str5 = pc;
char sa[] = “Hello World!”;
std::string str6 = sa;
/
如果希望用字符指针指向C++的字符串,则需要调用字符串类中的c_str()函数 该函数能够返回字符串对象中所存储的字符串数据在内存的地址。
*/
char const *pc1 = str6.c_str();
return 0;
}
2、字符串的基本运算
字符串的基本运算主要包括字符串的拼接、赋值和关系运算。
/ #include
int main(int argc, const char * argv[])
{
// 将字符串str2的内容拼接到字符串str1的 后一个字符后面,形成一个更大的字符串
std::string str1 = "Hello ";
std::string str2 = “World!”;
std::string str3 = str1 + str2;
std::string str4 = "Hello "; std::string str5 = “World!”;
std::string str6;
// 字符串对象间的相互赋值,将str5赋值给str6。
str6 = str5;
// 字符串对象间的复合赋值,本语句实现的是将str4与str5拼接后在赋值给str4。
str4 += str5;
std::string str7 = “zhangfei”;
std::string str8 = “zhaoyun”;
/
判断字符串str7与str8是否相等,其判断的方法是将两个字符串的对应字符进行比较
如果相同则比较下一个对应字符,直到有不同或两个字符串同时结束为止
str7与str8的第一对对应字符是z,第二对对应字符是h,第三对对应字符是a,第四对对
*/
if (str7 == str8)
std::cout << str7 << “==” << str8 << std::endl;
else if (str7 < str8)
std::cout << str7 << “<” << str8 << std::endl; else
std::cout << str7 << “>” << str8 << std::endl;
return 0;
}
3、字符串的大小和
/*
字符串的大小或长度是指该字符串实际容纳的字符数,而字符串的容量是该字符串 多容纳的
/ #include
int main(int argc, const char * argv[]) {
std::string str1 = “Hello World!”;
/
size()和length()都能获得字符串实际容纳的字符数
length()函数是较早版本的,size()是为了和容器类保持一致新添加的
/
std::cout << str1.size() << std::endl; std::cout << str1.length() << std::endl;
/
是用来更改字符串实际容纳的字符数的
当第一个参数小于原字符串实际容纳的字符数时,字符串将只保留第一个参数指定的前几,当第一个参数大于原字符串实际容纳的字符数时,字符串多出来的空间将有第二个参数填*/
str1.resize(20, ‘a’);
std::cout << str1 << std::endl;
/*
获取的是字符串 多容纳的字符数
由于字符串可以动态改变,所以在向字符串添加字符时,字符串会变长
但不是添加一个字符就只变长一个字节,而是变长单位长度的字节数
这样做的好处是避免频繁内存操作,提高效率
*/
std::cout << str1.capacity() << std::endl;
// 可以指定字符串的容量。
str1.reserve(50);
std::cout << str1.capacity() << std::endl;
return 0;
}
4、字符串的拼接
/*
字符串拼接是指将两个字符串连接在一起,形成一个更长的字符串。
/ #include
int main(int argc, const char * argv[]) {
std::string str1 = "Hello ";
std::string str2 = “World!”;
// 将字符串str2拼接到字符串str1的后面。
str1.append(str2);
std::cout << str1 << std::endl;
std::string str3 = "Hello ";
std::string str4 = “Hello World!”;
/
将字符串str4的第6字符开始的连续6个字符,拼接到字符串str3的后面
该函数的第二个参数是从第一个参数的第几个字符开始计算,注意从0开始计算
第三个参数是从第二个参数开始的连续几个字符被拼接
/
str3.append(str4, 6, 6);
std::cout << str3 << std::endl;
std::string str5 = "Hello ";
// 将10个A拼接到字符串str5的后面
str5.append(10, ‘A’);
std::cout << str5 << std::endl;
return 0;
}
5、在字符串中搜索特定的字符
/
在字符串中搜索特定字符是指在字符串中寻找是否存在指定的字符或字符集。
*/ #include
int main(int argc, const char * argv[])
{
std::string str1 = “Hello World!”;
// 是在字符串str1中查找是否存在字符o,如果存在,则返回字符串中第一个o的位置。
std::cout << str1.find_first_of(‘o’) << std::endl;
std::string str2 = “World!”;
// 是在字符串str1中查找是否存在字符集str2中的字符,如果存在,则返回字符串中第
std::cout << str1.find_first_of(str2) << std::endl;
// 是在字符串str1中查找第一个与字符o不相同的字符的位置。
std::cout << str1.find_first_not_of(‘o’) << std::endl;
// 是在字符串str1中查找第一个与字符集str2中字符不相同的字符的位置。
std::cout << str1.find_first_not_of(str2) << std::endl;
// 在字符串str1中查找是否存在字符o,如果存在,则返回字符串从后向前查找的第一
std::cout << str1.find_last_of(‘o’) << std::endl;
// 字符串str1中查找是否存在字符集str2中的字符,如果存在,则返回字符串中从后向
std::cout << str1.find_last_of(str2) << std::endl;
// 在字符串str1中查找第一个与字符o不相同的字符的位置。
std::cout << str1.find_last_not_of(‘o’) << std::endl;
// 在字符串str1中查找第一个与字符集str2中字符不相同的字符的位置。
std::cout << str1.find_last_not_of(str2) << std::endl;
return 0;
}
6、在字符串中提取子字符串
/*
从字符串中提取子字符串是指将一个字符串中的一部分截取下来形成一个新的字符串。
/ #include
int main(int argc, const char * argv[]) {
std::string str1 = “Hello World!”;
/
定义一个新的字符串str2,其内容被初始化成字符串str1的第0个字符开始的连续6个字 第二个参数是从第一个参数的第几个字符开始截取,第三个参数是连续截取几个字符。
/
std::string str2(str1, 0, 6);
std::cout << str2 << std::endl;
/
是在字符串str1中截取第6个字符开始的连续6个字符作为一个新的字符串,赋值给str3 第一个参数是从str1的第几个字符开始截取,第二个参数是连续截取几个字符。
/
std::string str3 = str1.substr(6, 6);
std::cout << str3 << std::endl;
return 0;
}
7、访问字符串中的单个字符
/
访问字符串中的单个字符是像字符数组那样使用下标访问字符串中的某个元素。
*/ #include
int main(int argc, const char * argv[])
{
std::string str1 = “Hello World!”;
// 像访问字符数组那样,将字符串中的第2个字符提取出来显示,如果下标越界,不会报
std::cout << str1[2] << std::endl;
// 使用成员函数来获得字符串中的第6个字符并显示,如果参数越界,函数将抛出异常。
std::cout << str1.at(6) << std::endl;
return 0;
}
/*
字符串的查找是指查看在字符串中是否有另一个指定的子串。字符串的替换是指将字符串中指定部分替换成指定的内容。
*/ #include
int main(int argc, const char * argv[]) {
std::string str1 = “Hello World!”;
// 在字符串str1中查看是否有o,如果有则返回字符o在字符串str1中的位置,否则返回
std::cout << str1.find(“o”) << std::endl;
// 在字符串str1中的第5个位置开始向后查看是否有o,如果有则返回字符o在字符串
8、字符串的查找与替换 st
std::cout << str1.find(“o”, 5) << std::endl;
// 在字符串str1中从后向前查看是否有o,如果有则返回字符o在字符串str1中的位置。
std::cout << str1.rfind(“o”) << std::endl;
// 在字符串str1中的第5个位置开始向前查看是否有o,如果有则返回字符o在字符串
std::cout << str1.rfind(“o”, 5) << std::endl;
std::string str2 = “Tarena”;
// 将字符串str1中第6个字符开始的连续5个字符替换成字符串str2的内容。
str1.replace(6, 5, str2);
std::cout << str1 << std::endl;
return 0;
}
9、字符串的比较与排序
/*
字符串的比较是指将两个字符串的对应字符进行比较。
如果相同则对比下一对对应字符,知道不同或两个字符串同时结束。
字符串排序是指将字符串数组按指定顺序进行排序。
/ #include
int strCmp (const void a, const void* b)
{
return ((std::string const)a).compare ((std::string const)b);
}
int main(int argc, const char * argv[]) {
std::string str1 = “Hello World!”;
std::string str2 = “Hello World!”;
/*
字符串str1中的第一个字符与字符串str2中的第一个字符进行比较
如果相同,则对比各自的第二个字符,直到两个字符串结束
如果一直相同,则返回0;如果有不同的,则str1中的字符的ASCII码大于str2中的ASC*/
std::cout << str1.compare(str2) << std::endl;
std::string str3[] = {“chongqing”, “tianjin”, “beijing”, “shanghai”};
// 求字符数组str3的第一个元素所占的字节数。该值是作为qsort函数的参数使用。
size_t size = sizeof (str3[0]);
// 是求字符数组的元素个数。该值也是作为qsort函数的参数使用。
size_t nmemb = sizeof (str3) / size;
/*
调用库函数qsort对数组str3进行排序。
第一个参数是要排序的数组名
第二个参数是要排序的数组的元素个数
第三个参数是要排序的数组的每个元素所占的字节数
第四个参数是排序条件,它是一个函数的函数名
*/
qsort (str3, nmemb, size, strCmp);
for (int i = 0; i < nmemb; i++)
std::cout << str3[i] << std::endl;
return 0;
}
10、字符串的插入与删除
/*
字符串的插入是指在字符串中指定的位置插入指定的字符串。字符串删除是指在字符串中指定的位置删除指定长度个字符。
/ #include
int main(int argc, const char * argv[]) {
std::string str1 = “Hed!”;
std::string str2 = “llo Worl”;
// 在字符串str1的第2个位置插入字符串str2的所有内容。
std::cout << str1.insert(2, str2) << std::endl;
// 从字符串str1的第2个字符开始,连续删除8个字符。
std::cout << str1.erase(2, 8) << std::endl;
return 0;
}
11、字符串的交换与复制
/
字符串的交换是指将两个字符串的内容互相交换。
字符串复制是指生成一个新的字符串其内容为原有字符串的内容。
*/ #include
int main(int argc, const char * argv[]) {
std::string str1 = "Hello ";
std::string str2 = “World!”;
// 将字符串str1的内容与字符串str2的内容进行交换。
swap(str1, str2);
std::cout << str1 << std::endl;
std::cout << str2 << std::endl;
std::string str3 = “Hello World!”;
std::string str4;
// 将字符串str3中的所有字符复制到字符串str4中。
str4.assign(str3);
std::cout << str4 << std::endl;
std::string str5;
// 将字符串str3中的第2个字符开始连续8个字符复制到字符串str5中。
str5.assign(str3, 2, 8);
std::cout << str5 << std::endl;
return 0;
}