推荐使用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());}
推荐使用string的更多相关文章
- [改善Java代码]推荐使用String直接量赋值
建议52:推荐使用String直接量赋值 一.建议 String对象的生成方式有两种: 1.通过new关键字生成,String str3 = new String(“中国”); 2.直接声明,如:St ...
- 第01篇 为什么推荐使用String直接赋值
在四海学的时候,可能需要我们经过沉淀才会去想一些事情,有的时候不知道为什么这样或者那样的时候,从今天看是,胖先生打算给大家开辟一个课程,就是我的读书笔记. 首先我们来认识一下String字符串 一般对 ...
- 为什么推荐std::string而不是char*
例如如下: map<const char*, const char*> map_test; map_test["a"] = "a"; map_tes ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- java 13-4 Integer和String、int之间的转换,进制转换
1.int类型和String类型的相互转换 A.int -- String 推荐用: public static String valueOf(int i) 返回 int 参数的字符串表示形式. B. ...
- 编写高质量代码改善java程序的151个建议——[52-57]String !about String How to use them?
原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),须要转载的,保留下! Thanks Although the world is full of s ...
- String,StringBuffer,StringBuilder个人认为较重要的区别
今天在整理不可变对象知识点时,突然看到了String,StringBuffer,StringBuilder三者的区别,这里就挑一些我认为比较重要的点记录一下,方便日后查看. Strin ...
- String深度解析
文章出处:http://my.oschina.net/xiaohui249/blog/170013 一.引题 String类型是比较特殊的一种类型,同时也是面试经常被问到的一个知识点,本文结合java ...
- 从String类型字符串的比较到StringBuffer和StringBuilder
1. String类型 String类源码 为了从本质上理解String类型的特性所在,我们从String类型的源码看起,在源码中String类的注释中存在以下: /**Strings are con ...
随机推荐
- interface 界面&接口
接口:接口(硬件类接口)是指同一计算机不同功能层之间的通信规则称为接口.接口(软件类接口)是指对协定进行定义的引用类型. 界面:窗口,显示 英文解释都是interface partly from ba ...
- 动态代理之: com.sun.proxy.$Proxy0 cannot be cast to 问题
转: 动态代理之: com.sun.proxy.$Proxy0 cannot be cast to 问题 2018年05月13日 00:40:32 codingCoge 阅读数:1211 版权声明 ...
- Ubuntu16安装wine(转)
原文:ubuntu16.04安装最新版本的wine 1.安装源 sudo add-apt-repository ppa:wine/wine-builds sudo apt-get update 2.安 ...
- python学习笔记:python异常的调用原理
因为错误是class,捕获一个错误就是捕获到该class的一个实例.因此,错误并不是凭空产生的,而是有意创建并抛出的.Python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误. h ...
- python爬虫获取图片
import re import os import urllib #根据给定的网址来获取网页详细信息,得到的html就是网页的源代码 def getHtml(url): page = urllib. ...
- (去重 sort)nyoj8-一种排序
8-一种排序 内存限制:64MB 时间限制:3000ms 特判: No通过数:235 提交数:749 难度:3 题目描述: 现在要求按照以下方式排序(默认排序都是从小到大) 现在有很多长方形,每一个长 ...
- C# 实现身份验证之WCF篇(2)
前面总结了三种方法,今天又将分享三种方法,完成WCF篇. 第四种:SOAP Header验证 首先定义一个WCF服务契约及服务实现类(后面的各种验证均采用该WCF服务),我这里直接采用默认的代码,如下 ...
- CodeForces160D 最小生成树 + dfs
https://cn.vjudge.net/problem/26727/origin 题目大意: 给一个带权的无向图,保证没有自环和重边. 由于最小生成树不唯一,因此你需要确定每一条边是以下三种情况哪 ...
- Nginx安装及配置详解包括windows环境
nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...
- JAVA核心技术I---JAVA基础知识(二进制文件读写和zip文件读写)
一:二进制文件读写 (一)写文件 –先创建文件,写入数据,关闭文件 –FileOutputStream, BufferedOutputStream,DataOutputStream –DataOutp ...