推荐使用string

C-string(char* const char*)

basic_string<>
特化版本:
string char
wstring wchar_t
u16string char16_t
u32string char32_t

Setlocale是一个计算机函数,功能是用来配置地域的信息,设置当前程序使用的本地化信息。
若 locale 为零(NULL),则不会改变地域化配置,返回当前的地域值,若系统尚未实作则返回 false。
使用系统默认的设置调用setlocale(LC_ALL,"");

wcout 输出 wstring需设置setlocale(LC_ALL, "chs");或wcout.imbue(locale("chs"));

wstring ws;
//wcout.imbue(locale("chs"));
setlocale(LC_ALL, "chs");

while (getline(wcin, ws))
{
for (int i = ws.length() - 1; i >= 0; --i)
{
wcout << ws[i];
}
cout << endl;
}

setlocale(LC_ALL, "C");

= , assign() 赋予新值
swap() 交换
+=, append(),push_back() 添加字符
erase(), pop_back() 删除字符
clear() 移除全部字符
resize() 改变字符数量(在尾段删除或添加字符)
replace() 替换字符
empty() 判断是否为空
size(),length() 返回字符数量
max_size() 返回字符的最大可能个数
capacity() 返回重分配前的字符容量
reserve() 保留一定量内存以容纳一定数量的字符
shrink_to_fit() 缩减内存使符合当前的字符量
[],at() 某一个字符
front(),back() 第一个、最后一个字符
>>,getline() 从一个stream读取某值
<< 将某值写入stream

copy() 将string复制到一个字符array
data(),c_str() 将string以C-string形式返回,以‘\0‘结尾,就是其字符串的指针
substr() 子字符串
find
begin(),end() 迭代器

stoi() stol() stoll() stoul() stoull()
stof() stod() stold()
to_string(),to_wstring()

string s("nico");//s.length() 4
cout << s << "123\n";

string s1("nico", 5);//s.length() 5
cout << s1 << "123\n";

string s2(5,‘\0‘); //s.length() 5
cout << s2 << "123\n";

//string s3(‘x‘); //ERROR
string s3(1, ‘x‘);
string s4({‘x‘});

‘\0‘ 在string中不具特殊意义,但在一般C-string中却用来标识结束
不要以NULL取代nullptr或取代char*参数,因为NULL具有整数类型

data(),c_str()的返回值得有效期限在下次调用non-const成员函数时即告终止

string s("hello");
foo(s.c_str());

const char* p;
p = s.c_str();
foo(p);

s += "ext";
foo(p);//helloext

string没有format
采用

包含头文件#include <sstream>

stringstream ss;
ss << i << "dddd" << 3 << "4444";
string s ;
ss >> s; 或 s = ss.str();//推荐用后者

每次用完用ss.str("");来清空内容,否则下次再用的话会和上次的串连在一起

或使用sprintf_s

std::string string_format(const char* format, ...)
{
#if 1 // 最大长度限制:1024 - 1
char buff[1024] = { 0 };

int _Result;
va_list args;
__crt_va_start(args, format);
_Result = vsprintf_s(buff, sizeof(buff), format, args);
__crt_va_end(args);

std::string str(buff);
return str;
#else // 无长度限制
va_list args;
va_start(args, format);
int count = vsnprintf(NULL, 0, format, args); // 使用vsnprintf:warning C4996; 使用vsnprintf_s:无法自动计算长度
va_end(args);

va_start(args, format);
char* buff = (char*)malloc(count * sizeof(wchar_t));
vsnprintf(buff, count, format, args);
va_end(args);

std::string str(buff, count);
free(buff);
return str;
#endif
}

string与wstring之间的转换:

一、使用CRT库的mbstowcs()函数和wcstombs()函数,平台无关,需设定locale。

#include <string>
#include <locale.h> 

std::wstring s2ws(const std::string& s){
	std::string curLocale = setlocale(LC_ALL, NULL);   //curLocale="C"
	setlocale(LC_ALL, "chs");
	const char* _Source = s.c_str();
	size_t _Dsize = sizeof(char)*s.size() + 1;
	wchar_t* _Dest = new wchar_t[_Dsize];
	wmemset(_Dest, 0, _Dsize);
	size_t convertedChars = 0;
	mbstowcs_s(&convertedChars, _Dest, _Dsize, _Source, _TRUNCATE);
	//mbstowcs(_Dest, _Source, charNum);
	std::wstring result = _Dest;
	delete[] _Dest;
	setlocale(LC_ALL, curLocale.c_str());
	return result;
}

std::string ws2s(const std::wstring& ws)
{
	std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";  

	setlocale(LC_ALL, "chs");

	const wchar_t* _Source = ws.c_str();
	size_t _Dsize = 2 * ws.size() + 1;
	char *_Dest = new char[_Dsize];
	memset(_Dest, 0, _Dsize);
	size_t convertedChars = 0;
	wcstombs_s(&convertedChars, _Dest, _Dsize, _Source, _TRUNCATE);
	//wcstombs(_Dest, _Source, _Dsize);
	std::string result = _Dest;
	delete[]_Dest;

	setlocale(LC_ALL, curLocale.c_str());

	return result;
}

2.采用ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,无移植性)

#include <string>
#include <comutil.h>
using namespace std;
#pragma comment(lib, "comsuppw.lib")  

string ws2s(const wstring& ws);
wstring s2ws(const string& s);  

string ws2s(const wstring& ws)
{
_bstr_t t = ws.c_str();
char* pchar = (char*)t;
string result = pchar;
return result;
}  

wstring s2ws(const string& s)
{
_bstr_t t = s.c_str();
wchar_t* pwchar = (wchar_t*)t;
wstring result = pwchar;
return result;
}

3.调用Windows API
#include <string>
#include <windows.h>
using namespace std;

std::string WChar2Ansi(LPCWSTR pwszSrc)
{
int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);  

if (nLen<= 0) return std::string("");  

char* pszDst = new char[nLen];
if (NULL == pszDst) return std::string("");  

WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
pszDst[nLen -1] = 0;  

std::string strTemp(pszDst);
delete [] pszDst;  

return strTemp;
}  

string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); }  

//Converting a Ansi string to WChar string  

std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)  

{
int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
if(nSize <= 0) return NULL;  

WCHAR *pwszDst = new WCHAR[nSize+1];
if( NULL == pwszDst) return NULL;  

MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);
pwszDst[nSize] = 0;  

if( pwszDst[0] == 0xFEFF) // skip Oxfeff
for(int i = 0; i < nSize; i ++)
pwszDst[i] = pwszDst[i+1];  

wstring wcharString(pwszDst);
delete pwszDst;  

return wcharString;
}  

std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());}

  

原文地址:https://www.cnblogs.com/xslwm/p/9393673.html

时间: 2024-10-24 09:59:41

推荐使用string的相关文章

从String类型字符串的比较到StringBuffer和StringBuilder

1. String类型 String类源码 为了从本质上理解String类型的特性所在,我们从String类型的源码看起,在源码中String类的注释中存在以下: /**Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they ca

String,StringBuffer,StringBuilder个人认为较重要的区别

    今天在整理不可变对象知识点时,突然看到了String,StringBuffer,StringBuilder三者的区别,这里就挑一些我认为比较重要的点记录一下,方便日后查看.     String,StringBuffer,StringBuilder,都是final类,不允许被继承,在本质上都是字符数组,不同的是,String的长度是不可变的而后两者长度可变,在进行连接操作时,String每次返回一个新的String实例,而StringBuffer和StringBuilder的append

判断字符串是否为空--string.Empty、string=&quot;&quot;、s.length==0

Console.WriteLine("".Equals(string.Empty));//结果:true String.Empty和string=””是一样的,同样都是需要占用内存空间<空字符串>:但优先推荐使用string.Empty 还一种高效判断方法(s.length==0)来判断字符串是否为空字符串: [注意]:null string str=null则是表示str未指向任何对象.

java内存分配和String类型的深度解析(转)

一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析 关于String的许多令人迷惑的问题.下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文. 1.java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小? 2.String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBu

【转】java内存分配和String类型的深度解析

一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文. 1.java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小? 2.String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBui

Java内存分配和String类型的深度解析

一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文. 1.java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小? 2.String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBui

编写高质量代码改善java程序的151个建议——[52-57]String !about String How to use them?

原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),须要转载的,保留下! Thanks Although the world is full of suffering , it is full also of the overcoming of it.  -Hellen Keller 相信自己看得懂就看得懂了,相信自己能写下去,我就開始写了.事实上也简单-泥沙砖瓦浆木匠 Written In The Font Three pieces[52-3]

String类原理分析及部分方法

//String类原理分析及部分方法 //http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html //http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html //String类包含在java.lang包中,这个包在java的时候就自动import //String类是唯一一个不需要new关键词来创建对象的类. public class Test{ public

【转】CString,string,char*综合比较

(一)  概述 1.string和CString均是字符串模a板类: 2.string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中: 3.CString(typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char,wchar_t(unicode),TCHAR(ANSI与unicode均可)