首页 > 编程语言 >C++ 33.C++中的字符串类-狄泰软件学院

C++ 33.C++中的字符串类-狄泰软件学院

时间:2023-11-28 10:03:11浏览次数:44  
标签:string 33 C++ int ret 字符串 include 狄泰


C语言字符串的历史

  • C语言不支持真正意义上的字符串
  • C语言用字符数组和一组函数实现字符串操作
  • C语言不支持自定义类型,因此无法创建字符串类型

当年C语言主要用于开发UNIX操作系统,处理字符串的情况少,所以在当时的背景下没有让C语言中内置一个字符串类型。后来C语言越用越广泛,没办法只能用字符数组模拟字符串。在开发应用程序时,处理字符串的情况非常多,如果还使用字符数组处理字符串,那么开发效率就会很低,因此在C++中,就要引入字符串的概念。

C++字符串的解决方案

  • C++同样不支持真正意义上的字符串
  • C++支持自定义类型
  • C++可以通过类完成字符串类型的定义
  • C++完全兼容C,在C++中同样支持使用字符数组和一组函数来实现字符串的操作。

C++中可以自定义类类型,定义一些成员函数,重载操作符。所以在C++中完全可是使用类类型实现字符串类型。

C++中的原生类型系统是否包含字符串类型?

  • C++语言直接支持C语言的所有概念
  • C++语言中没有原生的字符串类型。

C++标准库中提供了string类类型

这个类类型完全实现了字符串的概念

  • string支持字符串连接
  • string支持字符串的大小比较
  • string支持字符串查找和提取
  • string支持字符串的插入和替换

1. 字符串连接:

#include <iostream>  
#include <string>  

using namespace std;

int main() 
{
    string str1 = "Hello";
    string str2 = "World";
    string str3 = str1 + " " + str2;
    cout << str3 << endl;
    cin.get();
    return 0;
}

输出:Hello World

2. 字符串大小比较:

#include <iostream>  
#include <string>  
  
using namespace std;  
  
int main() 
{  
    string str1 = "Apple";  
    string str2 = "Banana";  
    if (str1 < str2) 
        cout << str1 << " < " << str2 << endl; 
    else if (str1 > str2) 
        cout << str1 << " > " << str2 << endl; 
    else 
        cout << "字符相等." << endl;
    cin.get();
    return 0;  
}

输出:Apple < Banana

3. 字符串查找和提取:

#include <iostream>  
#include <string>  

using namespace std;

int main() 
{
    string str = "Hello, World!";
    size_t pos = str.find("World"); // 查找字符串"World"的位置  
    if (pos != string::npos) 
    { 
        // 如果找到了字符串"World"  
        string sub_str = str.substr(pos, 5); // 提取从位置pos开始的5个字符  
        cout << sub_str << endl;
    }
    else
        // 如果找不到字符串"World"  
        cout << "找不到字符串." << endl;
    cin.get();
    return 0;
}

输出:World

4.字符串插入和替换:

#include <iostream>  
#include <string>  

using namespace std;

int main() 
{
    string str = "Hello, World!";
    str.insert(7, "Beautiful "); // 在位置7插入字符串"Beautiful "  
    cout << str << endl;
    str.replace(7, 9, "Nice"); // 从位置7开始,替换9个字符为"Nice"  
    cout << str << endl;
    cin.get();
    return 0;
}

输出:
Hello, Beautiful World!
Hello, Nice World!

5.字符串排序

#include <iostream>
#include <string>  

using namespace std;

//对字符串进行由小到大排序 选择排序
void SortString(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]);
			} 
		}
	}
	return;
}

int main()
{
	string sa[5] = { "1","2","3","10","11" };
	SortString(sa, 5);
	for (int i = 0; i < 5; i++)
	{
		cout << sa[i] << endl;
	}
	cin.get();
	return 0;
}

输出:
1
10
11
2
3

  • 直接使用 >就可以进行字符串比较
  • a[]作为函数参数,传递的是数组的的首地址,而不是数组副本,所以在函数内部可以修改数组的值。
  • std::swap()可用于交换两个元素或者对象的值。可用于任何数据类型,包括内置类型(例如:intdouble)复杂类型(例如:类、结构体)。

6.字符串连接

#include <iostream>
#include <string>

using namespace std;

string AddString(string a[], int len)
{
    string ret = "";

    for (int i = 0; i < len; i++)
    {
        ret += a[i] + "-";
    }

    return ret;
}

int main()
{
    string sa[5] =
    {
        "狄泰",
        "学院",
        "的",
        "同学们",
        "求个关注",
    };

    cout << AddString(sa, 5) << endl;
    cin.get();
    return 0;
}

输出
狄泰-学院-的-同学们-求个关注-

  • 使用+可以进行字符串连接
  • ret += a,等价于 ret = ret + a
  • 在标准库中操作符重载是相当常见的,字符串类大量得使用了字符串重载。
  • 在C++中不需要使用字符数组模拟字符串了,直接使用string类。代码中,字符指针 char* 不再出现。

字符串与数字的转换

  • 标准库中提供了相关的类对字符串和数字进行转换
  • 字符串流类 sstream 用于string 的转换
  • 头文件是 sstream
  • 字符串输入流 istringstream
  • 字符串输出流 ostringstream

1.string -> 数字

#include <iostream>  
#include <sstream>  
#include <string>  
using namespace std;
int main() 
{
    string str = "3.14";
    // 定义字符串输入流,并传入一个str
    istringstream iss(str);
    // 定义一个double用于接收
    double num;
    if(iss >> num)
    	std::cout << "num: " << num << std::endl;
    cin.get();
    return 0;
}

输出: 3.14

  • iss >> num有一个布尔类型的返回值,用于判断传输是否成功

2.数字 -> string

#include <iostream>  
#include <sstream>  
#include <string>  
using namespace std;
int main() 
{
    // 定义字符串输出流
    ostringstream oss;
    int num = 123;
    oss << num;
    // 返回字符串
    string str = oss.str();
    cout << str << endl;
    cin.get();
    return 0;
}

输出: 123

  • 使用oss.str()返回输出流的字符串。
  • oss << num;也有返回值,返回的是流本身。oss << 123;等价于oss <<1<<2<<"3";

3.使用宏进行数字与字符串的转换

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

#define TO_NUMBER(s, n) (istringstream(s) >> n)
#define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str())

int main()
{
    double n = 0;

    if (TO_NUMBER("3.1415926", n))
        cout << n << endl;

    string s = TO_STRING(12345);

    cout << s << endl;
    std::cin.get();
    return 0;
}

输出
3.14159
12345

4.重载了右移运算符">>",使其在字符串上执行循环右移操作

#include <iostream>  
#include <string>  

using namespace std;  
  
// 重载右移运算符">>"
string operator >> (const string& s, unsigned int n)  
{  
    string ret = "";  
    unsigned int pos = 0;  
      
    // 使n对s的长度取模,防止n大于s的长度导致的无效右移  
    n = n % s.length();  
    // 计算开始切割的位置
    pos = s.length() - n;  
    // 从pos位置开始切割字符串,得到子字符串ret  
    ret = s.substr(pos);  
    // 从0位置开始切割字符串,得到子字符串tmp  
    string tmp = s.substr(0, pos);  
    // 将tmp添加到ret的尾部,完成循环右移操作  
    ret += tmp;  

    return ret;  
}  
  
int main()  
{  
    string s = "abcdefg";  
    string r = (s >> 3);  
    cout << r << endl;  
    return 0;  
}

输出
abcdefg
efgabcd

5.字符串反转

要求:
“we;tonight;you” -> “ew;thginot;uoy”

#include <iostream>
#include <string>

using namespace std;

string reverse(const string& s, const char c)
{
    string ret = "";

    return ret;
}

int main()
{
    cout << reverse("", ';') << endl;                 // 输出:空字符串
    cout << reverse(";", ';') << endl;                // 输出:;
    cout << reverse("abcde;", ';') << endl;           // 输出:edcba;
    cout << reverse("we;tonight;you", ';') << endl;   // 输出:ew;thginot;uoy
    cin.get();
    return 0;
}

输出


标签:string,33,C++,int,ret,字符串,include,狄泰
From: https://blog.51cto.com/wangpaifeixingy/8595273

相关文章

  • C\C++ 专栏目录
    个人总结序号内容笔记01C++获取网卡名称和IP地址笔记链接02C++设置VisualStudio编译器使用C++17标准笔记链接03C++使用Pugixml库,轻松处理XML文件笔记链接04C++使用ShellExecuteEx调exe程序笔记链接05C++使用exception类,抛出自定义异常并捕获笔记链接06C++使用soc......
  • C++标准库类std::packaged_task
    std::packaged_task是C++11引入的标准库类,用于封装可调用对象,如函数等,并将封装对象作为异步任务进行管理,通过与std::future结合使用,完成异步任务结果的获取。#include<iostream>#include<thread>#include<future>std::stringpromise_string(std::stringstr){......
  • 实验4 现代C++标准库与类模板
    实验任务5:1.代码:textcoder.hpp:1#pragmaonce23#include<iostream>4#include<vector>5#include<array>6#include<string>7usingnamespacestd;89classTextCoder10{11private:12stringtext;13......
  • 33基于playwright编写网络抓包工具
     fromplaywright.sync_apiimportsync_playwrightr'''可以利用playwright框架抓浏览器网络请求包,抓响应包输出会有识别不了的字符编码报错(暂无解决,或者不用解决)。'''#回调函数获取请求url、请求头、请求体defon_request(request):print(f'RequestURL:{request......
  • 支持修改键值的优先队列(以C++,Java为例)
    #include<queue>#include<functional>template<typenameT1,typenameT2>classmutable_priority_queue;template<typenameT1,typenameT2>classmutable_priority_queue{private:std::function<bool(conststd::pair<T1,T......
  • C++ vs Python
    WhyC++isfasterthanPythonhttps://www.freecodecamp.org/news/python-vs-c-plus-plus-time-complexity-analysis/SummaryTable编程语言stronglytyped?跨平台语言类型C++YesYes编译型PythonNoYes解释型参考资料stronglytypedprogrammingla......
  • openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项
    openGauss学习笔记-133openGauss数据库运维-例行维护-日维护检查项133.1检查openGauss状态通过openGauss提供的工具查询数据库和实例状态,确认数据库和实例都处于正常的运行状态,可以对外提供数据服务。检查实例状态gs_check-Uomm-iCheckClusterState检查参数openG......
  • ABC330 E Mex and Update 题解
    LinkABC330EMexandUpdateQuestion给一个数组\(a\),有\(Q\)次修改每次把\(a_i\)改成\(x\)问每次修改后,不在\(a\)数组中的最小非负数时多少Solution记录每个\(a_i\)出现的次数\(num\)每个修改操作可以看成时先删除,后添加用set维护为\(num_x=0\)的\(x\)......
  • P3375 【模板】KMP( 普及/提高− ) 题解
    题目传送门思路:首先我们要学习一下\(KMP\)算法,不会的可以看这个大佬的文章那么我们就直接开始讲思路了。针对于每一位,\(kmp\)算法已经预处理出了一个对应\(kmp\)数组的单元,映射着如果此位失配,它可能的最靠后的一个重新开头是哪一个。让我们举一个例子:假如让\(aaab\)与......
  • Snowflake Snow Snowflakes[PKUOJ 3349]
    这是一道蓝书上的哈希例题。相对简单。题面DescriptionYoumayhaveheardthatnotwosnowflakesarealike.Yourtaskistowriteaprogramtodeterminewhetherthisisreallytrue.Yourprogramwillreadinformationaboutacollectionofsnowflakes,andsear......