← C++ 高级程序设计(2020)2020-C++高级程序设计-C++ String
约 18 分钟阅读阅读 — 次
string类
- 相关方法
- 复制用=号
- 连接用+号
- 比较直接用是运算符
- 支持字符串数组
1. c++中的字符串的表示
- 使用string的形式来做,我们需要使用头文件<string.h>
- char* 指向字符串的指针,实质上是指向字符串的首字母
- const char* 一个不可以被修改的字符串
- char[] 一个字符数组
2. string操作
- 读入:
- 不能读入空格,以空格、制表符、回车符作为结束标志
- cin >> s
1 2 3
| string str1,str2,str3; cin >> str1 >> str2 >> str3; cout << str1 << "|" << str2 << "|" << str3 << "|";
|
- getline(cin,s):是指一次读一行,可以读入空格和制表符,以回车为结束符
1 2 3 4
| string str1,str2,str3; getline(cin,str1); getline(cin,str2); getline(cin,str3);
|
2.1. getline 三个参数
- 可以添加第三个参数是结束符
- 第一个参数是cin输入流,第二个参数是字符串,第三个是结束符。
1 2 3 4 5 6 7
| getline(cin,str1," "); getline(cin,str2,"'"); getline(cin,str3,"'"); getline(str4); getchar();
|
- 可以进行分隔来进行进一步处理
- 实现split:
,分隔
1 2 3 4 5 6 7 8
| string inputValues getline(cin,inputValues); vector<int> num; istringstream iss(inputValues); string temp; while(getline(iss,temp,',')){ num.push_back(stoi(temp)); }
|
2.2. 从string中获取char字符
- str.at(int index)
- str[index]
2.3. replace
| 函数名 |
作用 |
| replace(num1,num2,str) |
将从num1开始的num2个字符替换成为str |
| replace(num1,num2,str,num3,num4) |
将当前字符串的第num1开始的num2个字符替换成str的nums3开始的nums4个字符 |
| replace(num1,num2,num3,char) |
字符串第num1位置上以及后面的num2个字符替换成num3个char |
2.4. 比较
- compare
1 2 3 4 5
| if(s1 < s2) s1.compare(s2)
|
- strcmp
1 2 3 4
| int strcmp(const char *str1, const char *str2) 如果返回值 < 0,则表示 str1 小于 str2 如果返回值 > 0,则表示 str2 小于 str1 如果返回值 = 0,则表示 str1 等于 str2
|
2.5. 连接
- string = string1 + string2
- string1.append(string2)
2.6. 长度
- str.size() 或者 str.length()
2.7. 查找
| 函数名 |
作用 |
| str.find(str1) |
从前往后第一次找到 |
| str.find(str1,num) |
从num开始第一次找到str |
| str.rfind(str1) |
从后往前第一次找到 |
| str.rfind(str1,num) |
从后面向前第一次找到str |
| str.substr(pos,n) |
从pos开始取n个字符 |
2.8. 其他操作一览
| 函数名 |
作用 |
| strcat(char[],const char[]) |
字符串连接 |
| strcpy(char *dest,const char *src) |
字符串复制函数 |
| strlen(const char[]) |
字符串长度函数 |
| getchar() |
获取一个字符 |
| str.erase(num1,num2) |
擦除从num1开始的num2个字符 |
| str.insert(num,str) |
在第num个位置上插入str2 |
| reverse(str.begin(),str.end()) |
将字符串反过来 |
| transformer(str.begin(),str.end(),str.begin(),::toupper) |
转换 |
2.9. 字符串分隔
- 原型:char* strtok(char* str,char* delim)|
- 用来进行分解字符串,将str按照delim进行分割,返回第一个分隔值,之后只要循环进行分隔就行。
- sentence中间是第一个分隔的。
1 2 3 4 5
| char sentence[] = "This is a sentence"; char *tokenPtr = strtok(sentence," ") while(tokenPtr!= NULL){ tokenPtr = strtok(NULL," "); }
|
2.10. string的大小写转换
- 使用
string.h头文件
1 2 3 4
| char s[100]; s[i] = toupper(s[i]); s[i] = tolower(s[i]);
|
- 使用
algorithm头文件
1 2 3 4
| s1[i] = toupper(s1[i]); transform(s.begin(),s.end(),s.begin(),::toupper); transform(s.begin(),s.end(),s.begin(),::tolower);
|
3. string和数值类型转换
3.1. C++11标准:string转换成数值类型
1 2 3 4 5
| int i = stoi(str);
long i = std::stol(str); float i = std::stof(str); double i = str::stod(str);
|
- 具体的整数部分函数:其中b表示转换所用的基数,默认为10(表示十进制).p是size_t的指针,用来保存s中第一个非数值字符的下标,p默认为0,即函数不返回下标.
- stoi(s,p,b):int
- stol(s,p,b):long
- stoul(s,p,b):unsigned long
- stoll(s,p,b):long long
- stoull(s,p,b):unsigned long long;
- 具体的小数部分函数:参数p的作用与整数转换函数中的一样。
- stof(s, p):float
- stod(s, p):double
- stold(s, p):long double
3.2. string转换成数值类型(sscanf方法)
- sscanf() 用于将字符串转化为数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <iostream> #include <string> using namespace std; int main(){ char str[]="1234321"; int a; sscanf(str,"%d",&a); cout<<a<<endl; char str1[]="123.321"; double b; sscanf(str1,"%lf",&b); cout<<b<<endl; return 0; }
|
3.3. int转换成string
- 使用Stringstream
- 头文件:
#include<sstream>
3.3.1. 实例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <iostream> #include <sstream> #include <string> using namespace std; int main(){ int size = 100; stringstream strStream; for (int i = 1; i < size; ++i){ strStream.clear(); strStream << i; string numStr; strStream >> numStr; cout<<numStr<<" "; strStream.str(""); } cout<<endl; printf("size=%d\n", strStream.str().capacity()); return 0; }
|
3.3.2. 处理复用问题和内存问题
- 每次调用strStream.clear()是希望在每次使用完strStream之后清理strStream占用的资源,但stringstream的clear方法并没有真正地释放strStream占用的空间,这样strStream所占用的空间一直在增长。当size较大时,strStream消耗的内存迅速增长,可能出现严重问题。
- 所以我们使用
strStream.str("")来清空缓存区
3.4. 数字转换为字符串
- 更加自由,不限制于整数
- sprintf() 用于将数字转化为字符串:
sprintf(res,"%s%s",a,b)
- 简单转换方法:
to_string()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <iostream> #include <string> using namespace std; int main(){ char str[10]; int a=1234321; sprintf(str,"%d",a); int len=strlen(str); cout<<"字符串"<<str<<endl; cout<<"长度"<<len<<endl; char str1[10]; double b=123.321; sprintf(str1,"%.3lf",b); int len1=strlen(str1); cout<<"字符串"<<str1<<endl; cout<<"长度"<<len1<<endl; return 0; }
|
3.5. C++11标准:数字转字符串
- 标准库中定义了to_string(val);可以将其它类型转换为string。还定义了一组stoi(s,p,b)、stol(s,p,b)、stod(s,p,b)等转换函数,可以函数,可以分别转化成int、long、double等.
3.6. 字符串转换为char数组
1 2
| getline(cin,input); strcpy_s(str, input.c_str());
|
3.7. 字符串切片
1 2 3 4 5
| int main() { string test = "123"; cout << test.substr(1, test.size() - 2); cout << test.substr(1, test.size() - 1); }
|
3.8. 字符转换整数或者浮点数
- atof:转换为浮点数
- atoi:转换为整数
4. 参考
- Stringstream 缓冲区清空方法 和 复用StringStream 不是clear那么简单
- c++数字和字符串的转换
- 【整理】C++ string转int,string转double,string转long,int转string,double转string…
评论