什么是std::string...?怎么用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是std::string...?怎么用?相关的知识,希望对你有一定的参考价值。
参考技术Astd::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 *