第33课 C++中的字符串

1. 历史遗留问题及解决方案

(1)历史遗留问题

  ①C语言不支持真正意义上的字符串

  ②C语言字符数组一组函数实现字符串操作

  ③C语言不支持自定义类型,因此无法获得字符串类型

(2)解决方案

  ①从C到C++的进化过程引入了自定义类型

  ②在C++中可以通过类完成字符串类型的定义

 

2. 标准库中的字符串类

(1)C++直接支持C语言的所有概念

(2)C++语言中没有原来的字符串类型

(3)C++标准库提供了string类型支持字符串的连接、大小比较、子串查找和提取、字符串的插入和替换等操作

 

【编程实验】字符串类的使用   33-1.cpp

#include <iostream>
#include <string>
 
using namespace std;
 
//选择排序
void string_sort(string a[], int len)
{
    for(int i=0; i<len; i++)
    {
        for(int j = i; j < len; j++)
        {
            if(a[i] > a[j])
              swap(a[i], a[j]);
        }
    }
}
 
string string_add(string a[], int len)
{
    string ret = "";
    
    for(int i =0; i< len; i++)
    {
        ret +=a[i] + "; ";
    }
    
    return ret;
}
 
int main()
{
    string sa[7] =
    {
        "Hello World",
        "Horizon",
        "C#",
        "Java",
        "C++",
        "Python",
        "TypeScript"
    };
    
    string_sort(sa, 7);
    
    for(int i=0; i<7; i++)
    {
        cout << sa[i] << endl;
    }
    
    cout << endl;
    
    cout <<string_add(sa, 7) <<endl;
 
    return 0;
}

运行结果:

  

 

3. 标准库中的字符串类

(1)字符串流类:(<sstream>头文件)

  • 标准库中提供了相关的类字符串和数字进行转换

  • 字符串流类(sstream)用于string的转换

    • istringstream字符串输入流

    • ostringstream字符串输出流

(2)字符串数字转换

  string→数字        

数字→string

istringstream iss("123.45");

double num;

iss>>num;

ostringstream oss;

oss<<543.21;

string s = oss.str();

 

 

 

 

 

 

【编程实验】字符串和数字的转换   32-2.cpp

#include <iostream>
#include <sstream>
#include <string>
 
using namespace std;
 
//TO_NUMBER定义为宏主要目的是为了能将任意类型(如double,int)
//的数字型字符串转为数字
#define TO_NUMBER(s, n) (istringstream(s)>>n)
#define TO_STRING(n)    (((ostringstream&)(ostringstream()<<n)).str())
 
int main()
{
    double n = 0; //也可以是int
    
    if(TO_NUMBER("234.567", n))
    {
        cout << n << endl;
    }
    
    string s = TO_STRING(12345);
    cout << s << endl;
 
    return 0;
}

运行结果:

  

 

(3)string类的相关操作

  ①注意事项:

    A. #include <string>。注意,不是<string.h>。

    B. 分为string和wstring版。分别对应char和wchar_t

    C. using std::string;或using std::wstring;

  ②string类的相关操作(点这里的链接

 

【编程实验】用C++完成字符串的循环移位  33-3.cpp

#include <iostream>
#include <string>
 
using namespace std;
 
string operator >> (const string& s, unsigned int n)
{
    string ret = "";
    unsigned int pos = 0;
    
    n = n % s.length();
    pos = s.length() - n;
    ret = s.substr(pos); //pos后面的字符串放入ret
    ret += s.substr(0,pos);//在新的ret后面放入s的前pos个字符
    
    return ret;
}
 
int main()
{
    string s = "abcedfg";
    string r = (s >> 3);
    
    cout << r << endl;
 
    return 0;
}

运行结果:

  

 

4. 小结

(1)应用开发大多数的情况都在进行字符串处理

(2)C++中没有直接支持原生的字符串类型

(3)标准库中通过string支持字符串的概念

(4)string类支持字符串和数字相互转换

(5)string类应用使得问题的求解变得简单

posted @ 2018-12-23 10:52  梦心之魂  阅读(216)  评论(0编辑  收藏  举报