【C / C++ 】带你系统认识 string(下)
1.substr
substr 用于截取指定位置、指定长度的字符串,返回类型为 string ,需要用 string 类型的字符串接收, 作为 string 封装里的函数,它在调用的时候同样是 (字符串名). (函数名)

sbustr 这个函数在调用的时候可以给他传最多两个参数,也可以完全不传参数,分别对应着三种情况。
第一个参数表达的意思从哪里开始截取字符串,即 pos (position),需要注意这里的位置和字符数组也是一样的,是从0开始计算,而非从1
第二个参数表达的是需要截取字符串的长度
如果不传参表达的意思就是0开始截取字符串,直到末尾
int main()
{
string s = "Hello world";
string s1 = s.substr(); //Hello world
string s2 = s.substr(0,5); //Hello
string s3 = s.substr(6,5); //world
cout << s1 << endl << s2 << endl << s3 << endl;
return 0;
}
不知道大家有没有学过 strcpy 这个函数,这个是 c 语言中复制字符数组的一个函数。如果你学过,那这个时候你可能会对 substr 不传参的情况和 strcpy 做对比。甚至觉得他们俩好像没有什么区别,但其实这两个函数的区别还是挺大的
1.2 与 strcpy 的关键区别
|
其中最明显的区别就是 strcpy,它只能处理 c 语言风格的字符数组,也就是我们常见的 char arr[]; substr 它处理的就是 string 类型的字符串。
1.3 与 find 搭配使用
substr 这个函数经常用来和 find 搭配使用在字符串找到某个字符之后就向后截取多少长度的字符串。
int main()
{ //01234567
string s = "liuqipei z j b";
int pos = s.find("qi"); //pos = 3
string s1 = s.substr(pos,5); // s1 == qipei
cout << s1 << endl;
return 0;
}
2.string 的关系运算
实际上字符串也是可以比较大小的。你可能觉得很不可思议,或者很奇怪,为什么字符串也能比较大小,难道是比较它们的 ASCII 码值吗?没错,其类似于整数的大小比较。在前面的权重更大,在后面的权重更小的特点,但与整数的比较不同的是,字符串的比较并不会比较位数的多少。
你可能很好奇这样的操作是如何实现的,其实这就涉及到了 C++ 这门语言在编写的时候的一个操作叫做运算符重载,但是我们这今天的不细致的探讨它是如何实现的,只告诉你如何使用。
int main()
{
string s1 = "abcde";
string s2 = "b";
if(s2 > s1)
{
cout << "s2" << ' > ' << "s1" << endl;
}
// 输出 s2 > s1
return 0;
}
如果你理解了我上面说的那句话。也许你就能理解这个大小的比较为什么是这样,其实string字符串的大小比较只要从第一位开始一位一位的去比较,如果相等就比较下一位,如果全部相等就判为相等。但只要出现了大小的差异,那更大的那个大
3. stoi 和 stol stof 和 stod
s 代表字符串,to 到, i 代表 int 。stoi 代表的意思就是把字符串转化为整型。其他几个也是同理,l 代表 long int 或 long long int。f 代表 float,d 代表 double。
你可能好奇从字符串转化为整形,怎么转换?难道对应的字符要转化为它的 ACSII 码值吗?当然不是,其实只是把字符串中的数字提取出来,然后改变他们的数据类型,并不改变他们本身。而如果字符串里没有数字的话,就无法提取。


注意:这四个函数都是和 string 相关的函数,而不是在 string 封装里的函数。意思就是说我们使用它的时候直接调用就可以了,不用之前的(字符串名). (函数名)的形式了
这四个函数的第一个参数表示 待转换的字符串名
第二个是一个输出型参数,它的作用是记录下第一个无法正确匹配数字的位置。意思就是你在这个函数的第二个参数的位置传入了一个地址,那在程序不出错的情况下,它会给你返回一个值,并且赋到参数里面。
至于只有 stoi 和 stol 有的第三个参数代表的其实是你传入这个字符串中的数字的进制值,如果传2那就代表二进制,8就代表八进制,你也可以传0。传零的意思是其实是让计算机自行推导。字符串中的数字的进制值像0x 开头就十六进制,0开头就是八进制。
stoi 示例代码
int main()
{
size_t pos = 0;
// 012345
string s = "233abc";
int n = stoi(s, &pos, 10);
cout << n << ' ' << pos << endl;
//n 为 233 pos 为 3 即 a 的位置
return 0;
}
stod 示例代码
int main()
{
size_t pos = 0;
// 012345
string s = "3.14abc";
double n = stod(s, &pos);
cout << n << ' ' << pos << endl;
//n 为 3.14 pos 为 4 即 a 的位置
return 0;
}
4. to_string
不知道看完这个函数的名字你有没有什么想法?没错,这就是一个把数字类型转化成字符串类型的函数。函数使用起来其实非常简单。它的返回类型是 string,而传入的参数就有很多种了,从 int 到 long int 到 float 到 long double 都是可以的。它的作用也是一样,不改变内容,单纯的把他们从数字的类型转换成字符串类型。
to_string (整数版)
int main()
{
int a = 3; //已知 x 的ASCII码是120
cout << 3 + 'x' << endl; //输出 123
string sa = to_string(a);
cout << sa + 'x' << endl; //输出 3x
return 0;
}
to_string (浮点数版)
int main()
{
double f = 3.14159;
cout << "pi is " + to_string(f) << endl;
//输出pi is 3.141590
return 0;
}









