当前位置:数据分析 > C++字符串的陷阱、C++字符串的补充功能(类型转换、拆分、合并、瘦身)、C++字符串的内存本质(简单明了的测试)

C++字符串的陷阱、C++字符串的补充功能(类型转换、拆分、合并、瘦身)、C++字符串的内存本质(简单明了的测试)

  • 发布:2023-10-06 04:57

-->

1。 size_type find_first_of( const basic_string &str, size_type index = 0 );

查找字符串中与 str 中的字符匹配的第一个字符并返回其位置。搜索从索引开始。如果未找到,则返回 string::npos

2。字符串&替换(size_t pos, size_t len, const string& str);

从当前字符串的 pos 位置开始,将长度为 len 的段落替换为 str

3。 int 比较 (const string& str)

结果为0,表示字符串相等,相当于字符串之间=

4。 data() 和 c_str() 的区别

data()是指返回一个字符数组,末尾可能有'\0',也可能没有。

c_str()指返回C兼容的字符串,末尾必须有'\0'

5。 at() 和 []

的区别

[]没有越界检查,不会抛出异常,效率高

at()检查越界并抛出异常,安全性很高

6.size_t copy(char* s, size_t len, size_t pos = 0) const;

将 strign 的内容复制到外部字符数组,而不是将外部字符串复制到 string
7.size() 和 length()
size() 返回字符串的长度,它是字节数,而不是字符数。 String 忽略内部字符使用的编码方法,并将其视为字节的集合。 size() 和 length() 具有相同的功能和含义。前者是为了配合STL标准而添加的接口。
http://www.sychzs.cn/guoxiaoqian/p/4275959.html
int StringUtil::intFromString(字符串数据)
{
//注意atoi是非标准C函数
返回 atoi(data.c_str());
}
字符串 StringUtil::stringFromInt(int 数据)
{
char tmp[];
memset(tmp,,);
sprintf(tmp,"%10d",数据);
返回字符串(tmp);
}
double StringUtil::doubleFromString(字符串数据)
{
双tmp;
sscanf(data.c_str(),"%lf",&tmp);
返回 tmp;
}
字符串 StringUtil::stringFromDouble(双数据)
{
char tmp[];
memset(tmp,,);
sprintf(tmp,"%20.3lf",数据);
返回字符串(tmp);
}
float StringUtil::floatFromString(std::string data)
{
浮动tmp;
sscanf(data.c_str(),"%f",&tmp);
返回 tmp;
}
std::string StringUtil::stringFromFloat(浮点数据)
{
char tmp[];
memset(tmp,,);
sprintf(tmp,"%20.3f",数据);
返回字符串(tmp);
}
bool StringUtil::boolFromString(std::字符串数据)
{
if(data.compare("true") == )
返回真;
否则
返回 false;
}
std::string StringUtil::stringFromBool(bool 数据)
{
如果(数据)
返回字符串(“true”);
否则
返回字符串(“假”);
}
矢量 StringUtil::splitStringToArray(std::字符串源, std::字符串分隔符)
{
矢量结果;
if(!source.empty())
{
字符串::size_type开始=;
字符串::size_type结束=;
unsigned int sepSize = seperator.size();
while((end = source.find_first_of(seperator,begin))!=string::npos)
{
string item = source.substr(begin,end-begin);
result.push_back(item);
开始=结束+ sepSize;
}
//最后一项,注意如果最后一个是分隔符,则最后一个元素是空字符串
if(begin <= source.size())
{
string item = source.substr(begin,source.size() - begin);
result.push_back(item);
}
}
返回结果;
}
std::string StringUtil::linkArrayToString(向量数组,std::字符串分隔符)
{
字符串结果;
if(array.size() > )
{
unsigned int limit = array.size() - ;
for(无符号整数 i=;i< limit;++i)
{
结果+=数组[i];
结果+=分隔符;
}
结果+=数组[限制];
}
返回结果;
}
映射 StringUtil::splitStringToMap(std::string source, std::string PrimarySep, std::string secondarySep)
{
矢量数组= StringUtil::splitStringToArray(source,primarySep);
矢量 tmpArray;
地图结果;
for(unsigned int i = ; i< array.size();++i)
{
tmpArray = StringUtil::splitStringToArray(array[i],secondarySep);
if(tmpArray.size() >= )
{
结果[tmpArray[]] = tmpArray[];
}
}
返回结果;
}
std::string StringUtil::linkMapToString(map tmpMap, std::string PrimarySep, std::string secondarySep)
{
矢量 tmpArray;
字符串 tmpStr;
map::迭代器 it = tmpMap.begin();
for(;it!=tmpMap.end();++it)
{
tmpStr = it->first+secondarySep+it->second;
tmpArray.push_back(tmpStr);
}
返回 StringUtil::linkArrayToString(tmpArray,primarySep);
}
std::string StringUtil::trimFront(std::string 数据)
{
无符号整型 i = ;
for(;i {
}
if(ireturn data.substr(i,data.size()-i);
否则
返回字符串("");
}
std::string StringUtil::trimBack(std::string 数据)
{
int i = data.size()-;
for(;i>=&&www.sychzs.cn(i)==' ';--i)
{
}
如果(i>=)
return data.substr(,i+);
否则
返回字符串("");
}
std::string StringUtil::trim(std::string 数据)
{
字符串 tmp = StringUtil::trimFront(data);
返回 StringUtil::trimBack(tmp);
}

http://www.sychzs.cn/guoxiaoqian/p/4113339.html

虽然没有研究过string的源码,但是可以肯定的是,string的内存空间是在堆上开辟的,而且是它自己负责释放空间,不需要我们参与。

我们用动态分配的字符串指针初始化字符串对象retStr。它会执行一个复制过程,并将字符串存储到retStr自己的内存空间中。之后retStr就和ret没有关系了,所以我们要记得释放ret:

1 char* ret = (char*)malloc(len_str);
2 memset(ret,0,len_str);
3 //操作ret ...
4 字符串 retStr(ret);
5 免费(ret);

http://www.sychzs.cn/guoxiaoqian/p/3944805.html

-->

相关文章