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之间的转换:

  1. 一、使用CRT库的mbstowcs()函数和wcstombs()函数,平台无关,需设定locale
  2.  
  3. #include <string>
  4. #include <locale.h>
  5.  
  6. std::wstring s2ws(const std::string& s){
  7. std::string curLocale = setlocale(LC_ALL, NULL); //curLocale="C"
  8. setlocale(LC_ALL, "chs");
  9. const char* _Source = s.c_str();
  10. size_t _Dsize = sizeof(char)*s.size() + 1;
  11. wchar_t* _Dest = new wchar_t[_Dsize];
  12. wmemset(_Dest, 0, _Dsize);
  13. size_t convertedChars = 0;
  14. mbstowcs_s(&convertedChars, _Dest, _Dsize, _Source, _TRUNCATE);
  15. //mbstowcs(_Dest, _Source, charNum);
  16. std::wstring result = _Dest;
  17. delete[] _Dest;
  18. setlocale(LC_ALL, curLocale.c_str());
  19. return result;
  20. }
  21.  
  22. std::string ws2s(const std::wstring& ws)
  23. {
  24. std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
  25.  
  26. setlocale(LC_ALL, "chs");
  27.  
  28. const wchar_t* _Source = ws.c_str();
  29. size_t _Dsize = 2 * ws.size() + 1;
  30. char *_Dest = new char[_Dsize];
  31. memset(_Dest, 0, _Dsize);
  32. size_t convertedChars = 0;
  33. wcstombs_s(&convertedChars, _Dest, _Dsize, _Source, _TRUNCATE);
  34. //wcstombs(_Dest, _Source, _Dsize);
  35. std::string result = _Dest;
  36. delete[]_Dest;
  37.  
  38. setlocale(LC_ALL, curLocale.c_str());
  39.  
  40. return result;
  41. }
  42.  
  43. 2.采用ATL封装_bstr_t的过渡:(注,_bstr_Microsoft Specific的,无移植性)
  44.  
  45. #include <string>
  46. #include <comutil.h>
  47. using namespace std;
  48. #pragma comment(lib, "comsuppw.lib")
  49.  
  50. string ws2s(const wstring& ws);
  51. wstring s2ws(const string& s);
  52.  
  53. string ws2s(const wstring& ws)
  54. {
  55. _bstr_t t = ws.c_str();
  56. char* pchar = (char*)t;
  57. string result = pchar;
  58. return result;
  59. }
  60.  
  61. wstring s2ws(const string& s)
  62. {
  63. _bstr_t t = s.c_str();
  64. wchar_t* pwchar = (wchar_t*)t;
  65. wstring result = pwchar;
  66. return result;
  67. }
  68.  
  69. 3.调用Windows API
  70. #include <string>
  71. #include <windows.h>
  72. using namespace std;
  73.  
  74. std::string WChar2Ansi(LPCWSTR pwszSrc)
  75. {
  76. int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
  77.  
  78. if (nLen<= 0) return std::string("");
  79.  
  80. char* pszDst = new char[nLen];
  81. if (NULL == pszDst) return std::string("");
  82.  
  83. WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
  84. pszDst[nLen -1] = 0;
  85.  
  86. std::string strTemp(pszDst);
  87. delete [] pszDst;
  88.  
  89. return strTemp;
  90. }
  91.  
  92. string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); }
  93.  
  94. //Converting a Ansi string to WChar string
  95.  
  96. std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)
  97.  
  98. {
  99. int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
  100. if(nSize <= 0) return NULL;
  101.  
  102. WCHAR *pwszDst = new WCHAR[nSize+1];
  103. if( NULL == pwszDst) return NULL;
  104.  
  105. MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);
  106. pwszDst[nSize] = 0;
  107.  
  108. if( pwszDst[0] == 0xFEFF) // skip Oxfeff
  109. for(int i = 0; i < nSize; i ++)
  110. pwszDst[i] = pwszDst[i+1];
  111.  
  112. wstring wcharString(pwszDst);
  113. delete pwszDst;
  114.  
  115. return wcharString;
  116. }
  117.  
  118. std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());}

  

推荐使用string的更多相关文章

  1. [改善Java代码]推荐使用String直接量赋值

    建议52:推荐使用String直接量赋值 一.建议 String对象的生成方式有两种: 1.通过new关键字生成,String str3 = new String(“中国”); 2.直接声明,如:St ...

  2. 第01篇 为什么推荐使用String直接赋值

    在四海学的时候,可能需要我们经过沉淀才会去想一些事情,有的时候不知道为什么这样或者那样的时候,从今天看是,胖先生打算给大家开辟一个课程,就是我的读书笔记. 首先我们来认识一下String字符串 一般对 ...

  3. 为什么推荐std::string而不是char*

    例如如下: map<const char*, const char*> map_test; map_test["a"] = "a"; map_tes ...

  4. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  5. java 13-4 Integer和String、int之间的转换,进制转换

    1.int类型和String类型的相互转换 A.int -- String 推荐用: public static String valueOf(int i) 返回 int 参数的字符串表示形式. B. ...

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

    原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),须要转载的,保留下! Thanks Although the world is full of s ...

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

        今天在整理不可变对象知识点时,突然看到了String,StringBuffer,StringBuilder三者的区别,这里就挑一些我认为比较重要的点记录一下,方便日后查看.     Strin ...

  8. String深度解析

    文章出处:http://my.oschina.net/xiaohui249/blog/170013 一.引题 String类型是比较特殊的一种类型,同时也是面试经常被问到的一个知识点,本文结合java ...

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

    1. String类型 String类源码 为了从本质上理解String类型的特性所在,我们从String类型的源码看起,在源码中String类的注释中存在以下: /**Strings are con ...

随机推荐

  1. java 分隔函数split("",-1)的用途

    转: java 分隔函数split("",-1)的用途 2017年12月14日 11:37:58 jaryle 阅读数:8517   1.如果字符串最后一位有值,则没有区别, 2. ...

  2. unittest的使用一

    selenium: (1).firefox官方下载驱动geckodriver,windows:放在\python36或者是27的目录下 Mac: /usr/local/bin (2).firefox的 ...

  3. Git学习笔记——搭建远程仓库

    有空再把笔记移上来 注意点:git remote add origin不是相对于所有git仓库,只相对于当前git仓库 心得:远程建立裸仓库,意味着我不应该直接操作远程仓库.如果我是管理员,我应该先p ...

  4. 数位DP入门题

    站点一览: hdu 2089"不要62" hdu 4734"F(X)" poj 3252"Round Numbers" hdu 3709&q ...

  5. JS生成随机数并排序

    JS生成[10,100]之间的十个随机数,并排序 function getRandom(start,end){ var m=end-start+1 return Math.floor(Math.ran ...

  6. mysql视图、触发事务、存储过程

    视图 视图是一个虚拟表(非真实存在的),其本质就是根据SQL语言获取动态的数据集,并为其命名,用户使用时只需要使用名称即可获得结果集,可以将结果集当做表来使用. 视图是存在数据库中的,如果我们程序中使 ...

  7. kubernetes1.5.2 dashboard配置

    镜像:https://hub.daocloud.io/#!/repos/f8919a2c-2540-424e-8758-d23cc76b6d80 启动Kubernetes集群 配置Kubernetes ...

  8. ranger部署文档(记)

    目录 概览... 2 1.      ranger-admin. 2 2.      ranger-user-sync. 2 3.      ranger-*-plugins. 2 安装... 3 1 ...

  9. JAVA核心技术I---JAVA基础知识(对象与类)

    一:规范 将每一个类存在一个单独的源文件中 Employee.java public class Employee { private int age; private float salay; pr ...

  10. 跳到IE9的一个坑里了(枚举 JavaScript 属性)

    有一段Json如下 [{"SaleName_ID":"0","SaleName":"","28":& ...