C++ 字符串截取转换及字符流控制
文章由来
------------------工作需要缓冲区里的字符串控制,还是混合编译的那种,根据协议来定义截取各种字符流,控制大小长度,截取返回的内容然后转换成特定的类型,
可能表述不是那么正确,若有错误,欢迎纠正。
环境VS2013
涉及Cstring 、String、char * 、istringstream、ostringstream、strstream类应该老手都不陌生,但是还是提一下方便自己回头看
Cstring: C语言的字符串
String:C++提供的字符串
char *:字符串指针
istringstream:C++风格字符串流的输入操作
ostringstream:C风格字符串流的输出操作
ostringstream buff;
sstringstream sbuff;
string mystr="";
cstring myCstr="";
char* myChP=NULL;
//C风格字符流转string<--->Cstring<--->char *<--->string
buff<<"hello world";
sbuff<<"hello kugou";
mystr = buff.str(); //ostringstream---->string
mystr = sbuff.str(); //sstringstream---->string
char*,string转cstring
myCstr = mystr.c_str(); //string--->cstring
myCstr = myChP; //char * --->cstring;不清楚是否存在隐含条件转换
string,cstring转char*
USES_CONVERSION;
myChP = W2A(myCstr.GetBuffer(0)); //cstring --->char* 若默认编码为unicode那么需要手动转换为ANSI
myCstr.ReleaseBuffer(0); //接上
① myChp = (char*)malloc((mystr.size() + 1)*sizeof(char)); //分配内存
② mystr.copy(myChP,mystr.size(),0); //string --->char* strcpy会存在内存泄漏,所以不推荐这个(其实可以后面在加结束符解决的),把长度为size的mystr复制到myChp,从下标为0开始
③ myChp[mystr.size()]='\0'; //需要手动接上结束符
④ free(myChp);
⑤ myChp=NULL;
const char *chData = mystr.data(); || const char *chData = mystr.c_str();//常类型使用,string.data() 返回的数据不以'\0'结束&&string.c_str()返回的都是常类型
cstring,char*转换为string
mystr = myChP; //char * --->string
mystr = myCstr.GetBuffer(0); //cstring ---string 记得把工程的宽字节(unicode更改为ANSI或者从父类继承默认)
myCstr.ReleaseBuffer(0); //接上
若不会修改也可以在代码中转换
ANSI编码CString默认是窄字节
UNICODE默认是宽字节
而string总是窄字节
所以需要转换,以下是转换方式:
USES_CONVERSION;
mystr W2A(myCstr.GetBuffer(0));
myCstr.ReleaseBuffer(0);
以上字符串类型的相互转换到此结束;
--------------------------------------------------分隔符---------------------------------------------------
string str = "1 2 3 4 5...66662333";
cstring cstr = "1 2 3 4 5...66662333";
char *ChP = "1 2 3 4 5...66662333"; //实际就是个数组了
以上类型统一用index代替:
cstring 截取,替换,查找:
替换: str.replace(_T(" "),_T("")); //ps _T宏可以把一个引号引起来的字符串,环境设置,编译器会根据编译目标环境选择合适的(Unicode还是ANSI)
截取:index = str.Mid(2,3);截取str从第二个字符开始往后长度为3的字符串 //index--->“2 3“
查找:str.find('4'); //return 6 str.find(" 3");//return 3
int pos = cstr.find('2'); //return 2
pos = cstr.find('2',pos+1); //下标从0开始,所以位置要+1开始,也就是下标为3开始查找查找第二个2,
cstr.setAt(pos,‘-’); //将找到的pos 位置的 '2' 替换成 '-'即可
csting cstrdemo = cstr.Mid(2,4); //结果为 "2 3 " 从下标为2开始往后截取长度为4的子串
string 截取,替换,查找:
替换:
static String^ Replace(
String^ Expression,
String^ Find,
String^ Replacement,
int Start = 1,
int Count = -1,
CompareMethod Compare = CompareMethod::Binary
)
截取:
static String^ Mid(
String^ str,
int Start
)
static String^ Mid(
String^ str,
int Start,
int Length
)
查找:
string.find("str",pos); //失败返回-1 从pos开始,查找,成功返回收个str的位置。
string find (const string& str, size_t pos = 0) const;
此外还有rfind()查找字符最后一次出现的地方:
rfind()
语法:
size_type rfind( const basic_string &str;, size_type index );
size_type rfind( const char *str, size_type index );
size_type rfind( const char *str, size_type index, size_type num );
size_type rfind( char ch, size_type index );
std::string.substr(pos);截取pos开始到最后的字符串
std::string.substr(pos,n);截取pos开始到长度为n的字符串
补充一条,涉及数据通讯协议的这块,若不想使用转移字符,那么可以使用C++11的原始字符串
R“data(str)data”
其中原始字符串必须用()括起来,括号前后可以增加其他字符串,所加的字符串会被忽略,并且加的字符串必须在括号两边同时出现。
参考:
char* 这个基本得手动写算法了;
http://blog.csdn.net/zhaoyinhui0802/article/details/55223953 //涉及其他截取,left right,delete ,remove等操作
http://blog.csdn.net/amusi1994/article/details/53898960 //涉及编码操作
http://www.cplusplus.com/reference/string/string/find/ /涉及string::find() 有支持C++98 C+11两个标准
C++ 字符串截取转换及字符流控制的更多相关文章
- Qt 字符串截取 获取指定字符位置
获取字符在字符串中的位置 QString str = "AT+LOC+LOCATION: 115.850441,33.004833"; QString s = "LOC& ...
- PHP操作字符串 截取指定长度字符 移除字符串两侧 左侧 右侧指定字符 或空白字符 替换字符
trim() trim() 函数移除字符串两侧的空白字符或其他预定义字符. <?php $str = "Hello World!"; echo $str . "&l ...
- js-DOM ~ 05. Date日期的相关操作、string、查字符串的位置、给索引查字符、字符串截取slice/substr/substring、去除空格、替换、大小写、Math函数、事件绑定、this
内置对象: 语言自带的对象/提供了常用的.基本的功能 打印数组和字符串不用for... in / 打印josn的时候采用for...in Date 获取当前事件: var date = ...
- asp.net 字符串替换、截取和从字符串中最后某个字符 开始截取
有时候要在一段字符串里面把某些字符替换成其他字符,怎么办? 例如: string image=@"csks/news/user_top/qqqq/qqqq.jpg"; image ...
- Linux c字符串中不可打印字符转换成16进制
本文由 www.169it.com 搜集整理 如果一个C字符串中同时包含可打印和不可打印的字符,如果想将这个字符串写入文件,同时方便打开文件查看或者在控制台中打印出来不会出现乱码,那么可以将字符串中的 ...
- js字符串长度计算(一个汉字==两个字符)和字符串截取
js字符串长度计算(一个汉字==两个字符)和字符串截取 String.prototype.realLength = function() { return this.replace(/[^\x00-\ ...
- Oracle 截取字符串(截取固定分隔符中间的字符
#### Oracle 截取字符串(截取固定分隔符中间的字符) #### #### oracle 取固定分隔符之间的字符--方法一 substr+ instrSELECT substr('12JP ...
- 关于MultiByteToWideChar与WideCharToMultiByte代码测试(宽字符与多字节字符的转换)以及字符串的转换代码测试
#pragma once #include <stdio.h> //getchar() #include <tchar.h> #include <stdlib.h> ...
- 归纳整理Linux下C语言常用的库函数----字符串转换、字符测试、及内存控制
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
随机推荐
- 接口上传base64编码图片
package com.*.util; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io. ...
- 【leetcode】1013. Pairs of Songs With Total Durations Divisible by 60
题目如下: In a list of songs, the i-th song has a duration of time[i] seconds. Return the number of pair ...
- Angular JS - 8 - SeaJS与前端模块化
一.前端模块化 关于前端模块化,参考以下链接 : https://github.com/seajs/seajs/issues/547 http://www.cnblogs.com/huiguo/cat ...
- CALayer的mask属性
可以对图层按path进行指定裁剪 //#import "ViewController.h" // //@interface ViewController () // //@end ...
- MVVM MVC
在WPF的MVVM模式中,View和ViewModel之间数据和命令的关联都是通过绑定实现的,绑定后View和ViewModel并不产生直接的依赖.具体就是View中出现数据变化时会尝试修改绑定的目标 ...
- Delphi 如何在程序中执行动态生成的Delphi代码
如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...
- blob格式导出文件
最近在做blob流导出相关功能,其中需要导出excel.csv.word.zip压缩文件之类的,在导出excel和word中需要知道对应的content-type属性,正好看到下面这篇文章,感觉挺好的 ...
- JS基础入门篇(六)— 数据类型
1.数据类型 数据类型:我感觉就是对数据的种类进行分类.就好比把人分为儿童,青少年,中年,老年一样. 基础数据类型: Number(数字),String(字符串),Null(空),Undefined( ...
- 讨论Spring整合Mybatis时一级缓存失效得问题
问题 1.学习测试时发现了一级缓存并没有生效,先看案例: setting配置: <settings> <!-- (1) 提供可控制Mybatis框架运行行为的属性信息 --> ...
- Workflow:Workflow 百科
ylbtech-Workflow:Workflow 百科 工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”.是对工作流程及其各操作步骤之间业务规则的抽象.概括描述.在计 ...