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 异常。

函数返回类型函数返回类型
转换成整型的函数转换成浮点型的函数
stoiintstoffloat
stollongstoddouble
stoulunsigned longstoldlong double
stolllong long
stoullunsigned long long

把字符串转换为整型的函数

string s(“100hello”);
将开始部分100转化为数值100并存储到变量value:
int value = stoi(s);
实际上该函数接受了三个参数——后两个是默认参数

  1. 包含需转化字符的字符串;
  2. 一个指向 size_t 类型变量的指针,函数通过该指针记录第一个没有被转化的字符串的索引,默认为nullptr,表示函数并不存储索引
  3. 一个范围为2~36的 int类型的变量用来记录进制数,默认10.
    因此,前面的语句等同于:
    int value = stoi (s, nullptr, 10);
    给定名为 index的size_t变量,下面语句:
    int value = stoi (s,&index,2);
    把二进制数值100转化为整型(对应十进制 4),索引 index 中存储的是 h 的位置 (因为 h 是第一个不能被转换的字符。

把字符串转换为浮点型的函数

将字符串转换为浮点类型的函数接受两个参数

  1. 一个包含转换字符的字符串
  2. 一个指向 size_t 类型变量的指针,函数通过该指针记录第一个没有被转化的字符串的索引,默认为nullptr,表示函数并不存储索引

对 string s(“100hello”);
double value = stod(s);,第二个参数默认空指针。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值