什么是std::string...?怎么用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是std::string...?怎么用?相关的知识,希望对你有一定的参考价值。

参考技术A

std::string是标准C++的字符串实现。为了让程序好移植,要用std::string。比如:

方法1:

#include <string>

std::string

方法2:

#include <string>

using namespace std;

string

string类的构造函数:

string(const char *s);    //用c字符串s初始化

string(int n,char c);     //用n个字符c初始化

此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常 ;

扩展资料

string类的字符操作:

const char &operator[](int n)const;

const char &at(int n)const;

char &operator[](int n);

char &at(int n);

operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。

const char *data()const;//返回一个非null终止的c字符数组

const char *c_str()const;//返回一个以null终止的c字符串

int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目

string的特性描述:

int capacity()const;    //返回当前容量(即string中不必增加内存即可存放的元素个数)

int max_size()const;    //返回string对象中可存放的最大字符串的长度

int size()const;        //返回当前字符串的大小

int length()const;       //返回当前字符串的长度

bool empty()const;        //当前字符串是否为空

void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分

std::string自带“/0”吗?怎么将string拷贝到char*?

std::string自带“/0”吗?怎么将string拷贝到char*?

结论

先说结论,string时不带“/0”的。
这个问题在网上一直有很多种说法,我之前也一直认为string的结尾是自带“/0"的,但是在进行string拷贝到char*字符串的时候,发现了不对劲!

我猜测的解释:

c语言用char*指针作为字符串时,在读取字符串时需要一个特殊字符0来标记指针的结束位置,也就是通常认为的字符串结束标记。
而c++语言则是面向对象的,长度信息直接被存储在了对象的成员中,读取字符串可以直接根据这个长度来读取,所以就没必要需要结束标记了。而且结束标记也不利于读取字符串中夹杂0字符的字符串。

将string拷贝到char*字符串

如果按照之前的想法,认为string自带”/0",那么string的size()方法,获得长度应该是带有“/0"的长度,但事实上不是的,这也是我犯的错误!
所以正确的方法应该是:

std::string tmp = "test";
int len = tmp.size(); // 这里应该是4
char* ch_str = (char)malloc(len+1);// 长度+1,即”/0“
memset(ch_str,0,len+1);
strncpy(ch_str,tmp.c_str(),len+1_;

以上是关于什么是std::string...?怎么用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::string.c_str() 作为另一个方法的参数时的段错误

std::string::c_str() 覆盖函数返回的前一个

我想将std :: string转换为const wchar_t *

将文件读入std :: string的最有效方法是什么?

为啥我仍然可以在字符串范围之外访问 std::string::c_str() 返回的 char 指针? [复制]

std::string::c_str() 结果的生命周期是多少?