string类和字符串流深入剖析
简介
初始化string对象
string text("Hello");
string name(8, 'x'); // 8 chars of 'x'
string month = "May"; //这里,‘=’不是赋值操作,是一个对构造函数的隐式调用。
字符串不一定以null结尾,不同于C风格中的 char* 字符串,string类不一定是用空字符终止的。
字符串处理,大多数string成员函数把开始的下标位置和操作的字符数作为参数进行操作。
可以重载流提取运算符>>来支持字符串操作。语句
string str1,str2;
cin >> str1; //从标准输入读入字符串,以空格字符结束
getline(cin, str2,' ');// 以空格作为分隔符读入字符串,以换行符'\n'结束。
字符串赋值和连接
str3 = text;
str4.assign(text);
name[2] = text[2] = 'r';
cout << "name.size() = "<<name.size()<<" name.at(2) = " << name.at(2) << endl;
str3 += "cat";
str4.append("acomb");
str5.append(str3, 3, str3.size() - 3); //str5 = 'cat'
字符串比较
//***************字符串的比较
if(str3 == text)
cout << "str3 == text" << endl;
else if(str3 > text)
cout << "str3 > text" << endl;
int result1 = str3.compare(text); //比较大小
int result2 = str3.compare(0, 4, text, 0, 4);
int result3 = str3.compare(0, text.size(), text);
字串交换字符串
//***************字串、交换字符串
cout << "str1.substr(0,4) = " << str1.substr(0, 4) << endl;
text.swap(name);
大小,长度,容量,最大长度,及其他特性
//***************大小,长度,容量,最大长度,及其他特性
cout << "capacity: " << text.capacity()
<< "\nmax_size: " << text.max_size()
<< "\nsize: " << text.size()
<< "\nempty: " << text.empty();
text.resize(10,'x'); // 调整text大小为10,不够截掉,剩余填充第二个参数
string中有两个函数:reserve()和resize(),最近细细的看了下这两个函数的使用,记录下来。
reserve为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。
resize调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size.
查找string的子串和字符
//***************查找子串和字符
int stringIndex = text.find('llo'); //返回子串开始处下标,如果未找到,返回string::npos(一个public静态常量)
stringIndex = text.rfind('llo'); //反向搜索
stringIndex = text.find_first_of('ok'); //查找'ok'中在字符串中最先出现的字符的位置
stringIndex = text.find_first_not_of('ok'); //查找字符串中第一个不属于'ok'的字符的位置
stringIndex = text.find_last_of('ok'); //查找'ok'中在字符串中最后出现的字符的位置
stringIndex = text.find_last_not_of('ok'); //查找字符串中最后一个不属于'ok'的字符的位置
字符串中替换和插入字符
//***************在字符串中替换、插入字符
text.erase(3); //删除从位置3到末尾的内容
size_t pos = str4.find("l");
while(pos != string::npos)
{
str4.replace(pos, 1, "AAA"); //将pos 处开始的1个字符,替换为第三个参数。
pos = str4.find("l", pos + 1); //第二个参数指定下一次开始搜索的位置
}
pos = str4.find("o");
str4.replace(pos, 2, "xxxxxxooooo", 3, 6); //将str4中pos 处开始2个字符替换为第三个参数中第3个位置处开始的6个字符
str4.insert(2, str5); //str5 插入到str4第2个元素前面
str4.insert(3, str5, 0, string::npos); //str5的开始到末尾的子串插入到str4第3个元素前面
转成C风格基于指针的字符串
//**************转为C风格字符串*****************
const char *ptr1 = nullptr;
size_t length = str5.size();
char *ptr2 = new char[length + 1];
str5.copy(ptr2, length, 0); // 复制到ptr2指向的字符数组
ptr2[length] = '\0'; //将终止空字符放到末尾
cout << "string str5 is: " << str5 << "\nstr5 convert to a pointer-based string is : "
<< str5.c_str(); // c_str()复制 str5,并自动添加结束的空字符,该函数返回const char*
// 将指针传递给流插入运算符输出
cout << endl;
ptr1 = str5.data(); // data()返回const char*给ptr1, 不带空结束字符
迭代器
//*************迭代器
string::const_iterator iter = str5.begin();
字符串流处理
除标准IO流和文件IO流外,C++ IO流还包括在内存中从字符串输入及输出字符串的功能,涉及到内存中的IO或字符串流处理。
类 istringstream 支持从字符串输入
类ostringstream 支持输出到一个字符串
该类名由 typedef 定义
typedef basic_istringstream< char > istringstream
typedef basic_ostringstream< char > ostringstream
类模板 basic_istringstream,basic_ostringstream提供与istream ,ostream及其他用于内存中格式化的成员函数一样的功能。使用内存中格式化的程序必须包含 < sstream > 和< iostream >
// *************************ostringstream演示
# include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
// ostringstream
string string1("This is a ostringstream ");
double dou = 3.14;
int integer = 22;
ostringstream out; // 创建流对象
out << string1 << dou << integer // 将字符串,双精度数,整数,地址输出到内存中的 out对象s
<< &integer<<"more string";
cout << "\nout contains: " << out.str(); //调用str()获取
// istringstream
istringstream in("6.28 input 44");
in >> dou >> string1 >> integer; //将数据提取到各个变量中
if(in.good()) //判断是否还有剩余
cout << "\NIs not empty." << endl;
return 0;
}
string字符串数值转换函数
数值转换为字符串对象
C++11 中,to_string 函数(头文件< string >)返回参数数值所代表的字符串,函数为int, unsigned int, long, unsigned long, long long, unsigned long long, float, double,long double 类型进行了重载。
字符串对象转换为数值
C++ 提供 8 个函数(包含在< string >中),每个函数都会把字符串的开始部分转换成数值,如果转换失败,抛出异常invalid_argument,如果返回值超出该类型范围,将抛出 out_of_range 异常。
函数 | 返回类型 | 函数 | 返回类型 |
---|---|---|---|
转换成整型的函数 | 转换成浮点型的函数 | ||
stoi | int | stof | float |
stol | long | stod | double |
stoul | unsigned long | stold | long double |
stoll | long long | ||
stoull | unsigned long long |
把字符串转换为整型的函数
string s(“100hello”);
将开始部分100转化为数值100并存储到变量value:
int value = stoi(s);
实际上该函数接受了三个参数——后两个是默认参数
- 包含需转化字符的字符串;
- 一个指向 size_t 类型变量的指针,函数通过该指针记录第一个没有被转化的字符串的索引,默认为nullptr,表示函数并不存储索引
- 一个范围为2~36的 int类型的变量用来记录进制数,默认10.
因此,前面的语句等同于:
int value = stoi (s, nullptr, 10);
给定名为 index的size_t变量,下面语句:
int value = stoi (s,&index,2);
把二进制数值100转化为整型(对应十进制 4),索引 index 中存储的是 h 的位置 (因为 h 是第一个不能被转换的字符。
把字符串转换为浮点型的函数
将字符串转换为浮点类型的函数接受两个参数
- 一个包含转换字符的字符串
- 一个指向 size_t 类型变量的指针,函数通过该指针记录第一个没有被转化的字符串的索引,默认为nullptr,表示函数并不存储索引
对 string s(“100hello”);
double value = stod(s);,第二个参数默认空指针。