C++中的字符串操作<cstring>和<string>的区别

本文探讨了C++中字符串的两种形式:string对象和字符数组。详细对比了cstring和string库的功能差异,解释了string类的实现原理及特性,如Copy-On-Write技术。

目录


注意不要盲目相信以下内容! 不要盲目相信以下内容! 不要盲目相信以下内容! (重要的事情说三遍),虽然以下内容也经过了我的验证,但是我的验证可能有错误的地方,欢迎大家留言告知。希望这篇文章成为你深入探索相关领域的引子启发,而不是标准答案


参考资料

basic_string
cstring
string类使用

字符串

字符串在C++中由两种形式,第一种为string对象,另一种为char类型的数组即字符数组。
通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。
两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。

设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。

这是一些字符串处理算法,在字符串上进行不同的处理:
字符串查找算法
正则表达式算法
模式匹配
字符串的匹配算法(kmp)
AC自动机


cstring和string的区别在哪?

C++中由C语言的string.h库转的<cstring>库还有C++的basic_string库<string>有什么区别和联系?是不是可以理解成<string>库是包含了一些自定义函数的模板类?

有了<string>才有了string对象,所以<string>中主要是操作string对象,而<cstring>主要以char *类型为参数操作字符数组?

哦,是不是说封装成了类,只有字符串操作函数?

可以看一下以下代码,能够发现一些现象:

#include<iostream>
#include<cstring>
//#include<string>
using namespace std;

int main()
{
    string s = "Can you?";
    cout << s;//error,没有与std::string匹配的操作符
    system("pause");
    return 0;
}

当我们只包含了<cstring>时,这时如果couture<<s;就会报错,而我们include<string>后就可以正常运行了,这是为什么呢?

其实这验证了我们之前的猜想,让我们从string的实现来看一下。


string类的实现

C语言的字符串函数,简单而高效。C++ string类,功能强大而复杂(对于我这样的人来讲,复杂了点)。简单的比较没有意义,只是在特定的情况下哪一个更适合的问题。

而在决定哪一个更适合之前,你可能需要明白:

A STL标准模板库中的string类使用异常来传递错误

B STL标准模板库中的string类,是一个具有写时才拷贝(Copy-On-Write)技术的类。Copy-On-Write使用了“引用计数“,在下列情况下会使用Copy-On-Write:1)以别的类构造自己,2)以别的类赋值
(Copy-On-Write另一个被用到的地方是Linux在创建自己的进程时会使用这一技术,感兴趣的同学可以自行查阅相关资料)

C 不必担心内存是否足够和字符串长度的同时,你必须放弃严格控制其内存申请释放的想法。


明白了!你希望我写一个 **非常简单、基础、不涉及复杂语法或运算符重载** 的 C++ 程序,仅使用最基本的语法 `#include &lt;iostream>` 来实现一个简单的字符串类或功能。 --- ### ✅ 题目理解(简化版) 你想要的是一个: - 不使用 `&lt;&lt;` `>>` 运算符重载; - 不涉及拷贝构造、赋值运算符等高级内容; - 用 `#include &lt;iostream>` 正常写; - 实现一个 **最简单的字符串类**,能够保存字符串并输出; - 可以输入、输出显示字符串。 --- ### ✅ 简单版 `mystring` 类实现(基础教学版) ```cpp #include &lt;iostream> #include &lt;cstring&gt; using namespace std; class mystring { private: char str[100]; // 假设最大长度为 99 的字符串 public: // 默认构造函数 mystring() { str[0] = '\0'; // 初始化为空字符串 } // 设置字符串 void set(const char* s) { strcpy(str, s); } // 获取字符串 const char* get() const { return str; } // 显示字符串 void print() const { cout &lt;&lt; str &lt;&lt; endl; } // 输入字符串 void input() { cin >> str; } }; int main() { mystring s1, s2; cout &lt;&lt; "请输入一个字符串:"; s1.input(); cout &lt;&lt; "你输入的字符串是:"; s1.print(); s2.set("Hello World"); cout &lt;&lt; "预设字符串是:"; s2.print(); return 0; } ``` --- ### ✅ 说明 - 使用了固定大小的字符数组 `char str[100];`,避免使用 `new` `delete`。 - `set()` 方法用于设置字符串; - `get()` 方法用于获取字符串; - `print()` 方法用于输出字符串; - `input()` 方法用于输入字符串; - 所有操作都非常基础,适合初学者学习; - 没有使用任何复杂的 C++ 特性(如运算符重载、深拷贝、友元函数等); --- ### ✅ 编译运行方式 保存为 `simple_string.cpp`,然后在终端中运行: ```bash g++ simple_string.cpp -o simple_string ./simple_string ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值