String
新版的教材,这块涉及的不多,但从2020年8月真题来看,还真有可能会考到,所以还是得把这里当作一个正儿八经的考点来对待。这块其实也是经常用的。
c_str()函数???
c_str()是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。换种说法,c_str()函数返回一个指向正规C字符串的指针常量,内容与本string串相同。这是为了与C语言兼容,在C语言中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式。
c_str()的原型是:const charc_str() const; //c_str()生成一个const char指针,指向以空字符终止的数组。
典型应用场景:
将c++中的字符串转成C char 数组:
char c[20];
string s=“1234”;
strcpy(c,s.c_str());//不能用c=s.c_str形式,因为c_str()返回是一个const指针不能赋予一个char类型。
一个函数要求char*参数
string s = “Hello World!”;
printf("%s", s.c_str()); //输出 “Hello World!”
string的find()函数??
用于找出字母在字符串中的位置
通用原型为:find(str,position)//
str:是要找的元素
position:字符串中的某个位置,表示从从这个位置开始的字符串中找指定元素
g++中的原型为:
返回值为目标字符的在字符串中的位置,当没有找到目标字符时返回npos(c++中特定的标志,不同电脑打印出来的值可能不一样,我的电脑是18446744073709551615)如:position = s.find(“jk”);if (position != s.npos)
典型应用场景:
找目标字符的位置:
string s = “hello world!”;
cout << s.find(“e”) << endl;
指定查找位置
string s = “hello world!”;
cout << s.find(“l”,5) << endl;//从字符串s 下标5开始(也就是空格开始),查找字符串l ,返回l 在s 中的下标 ,打印为9
扩展:
与之对应的rfind//查找在字符串中最后出现的位置,如:
//反向查找,flag 在s 中最后出现的位置
string s="132124435"
flag="3";
position=s.rfind (flag);
cout<<"s.rfind (flag) :"<<position<<endl;
insert函数???
basic_string& insert (size_type pos, const basic_string& str);//在原串下标为pos位置(开始)插入字符串str ,这个比较常用
basic_string& insert (size_type pos, const basic_string& str, size_type pos1, size_type n);//str从下标为pos1开始数的n个字符插在原串下标为pos的字符前
basic_string& insert (size_type pos, size_type n, char c);//在原串下标为pos的字符前插入n个字符c
如:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str("All that exists is what's ahead.");
string a, b;
a = str.insert(4,"sky");//在下标为4的位置,插入字符串sky
cout << a << endl; //输出All skythat exists is what's ahead.
str = "All that exists is what's ahead.";
b = str.insert(4,5,'x'); //在下标为4的位置,插入字符串5个字符x
cout << b << endl; //输出 All xxxxxthat exists is what's ahead.
return 0;
}
substr()函数??
刚开始还以为是要减去,实际是截取字符串,本质和减去差不多。
原型:
s . substr(pos, n) //返回一个string,pos的默认值是0,n的默认值是s.size() - pos,即不加参数会默认拷贝整个s
pos:从pos位置开始截取
n:截取的字符的个数。
应用场景:就是截取
string s = "0123456789";
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789"
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567"
异常情况:若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾
append()函数???
原型:
s.append(s1); //向s字符串尾部添加s1字符串。添加后,s改变了。
应用场景:
添加另一个字符串的某一段子串:s.append(s1, pos, n);//添加s1字符串中,从pos起的n个字符。
添加几个相同的字符(这个常用)s.append(n,’.’);//添加n个点,可以构成省略号。点也可以是其实相同的字符,如‘=’
swap()函数?
原型
void swap( basic_string &str);
应用场景
swap()函数把str和本字符串交换。
string first( "this comes first" );
string second( "and this is second" );
first.swap( second );
cout << first << endl;
cout << second << endl;//输出的是 and this is second
//this comes first