文章由来

------------------工作需要缓冲区里的字符串控制,还是混合编译的那种,根据协议来定义截取各种字符流,控制大小长度,截取返回的内容然后转换成特定的类型,

可能表述不是那么正确,若有错误,欢迎纠正。

环境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++ 字符串截取转换及字符流控制的更多相关文章

  1. Qt 字符串截取 获取指定字符位置

    获取字符在字符串中的位置 QString str = "AT+LOC+LOCATION: 115.850441,33.004833"; QString s = "LOC& ...

  2. PHP操作字符串 截取指定长度字符 移除字符串两侧 左侧 右侧指定字符 或空白字符 替换字符

    trim() trim() 函数移除字符串两侧的空白字符或其他预定义字符. <?php $str = "Hello World!"; echo $str . "&l ...

  3. js-DOM ~ 05. Date日期的相关操作、string、查字符串的位置、给索引查字符、字符串截取slice/substr/substring、去除空格、替换、大小写、Math函数、事件绑定、this

    内置对象:  语言自带的对象/提供了常用的.基本的功能 打印数组和字符串不用for... in   /   打印josn的时候采用for...in Date 获取当前事件:   var date = ...

  4. asp.net 字符串替换、截取和从字符串中最后某个字符 开始截取

    有时候要在一段字符串里面把某些字符替换成其他字符,怎么办? 例如: string image=@"csks/news/user_top/qqqq/qqqq.jpg"; image ...

  5. Linux c字符串中不可打印字符转换成16进制

    本文由 www.169it.com 搜集整理 如果一个C字符串中同时包含可打印和不可打印的字符,如果想将这个字符串写入文件,同时方便打开文件查看或者在控制台中打印出来不会出现乱码,那么可以将字符串中的 ...

  6. js字符串长度计算(一个汉字==两个字符)和字符串截取

    js字符串长度计算(一个汉字==两个字符)和字符串截取 String.prototype.realLength = function() { return this.replace(/[^\x00-\ ...

  7. Oracle 截取字符串(截取固定分隔符中间的字符

    #### Oracle 截取字符串(截取固定分隔符中间的字符) #### ####  oracle 取固定分隔符之间的字符--方法一 substr+ instrSELECT  substr('12JP ...

  8. 关于MultiByteToWideChar与WideCharToMultiByte代码测试(宽字符与多字节字符的转换)以及字符串的转换代码测试

    #pragma once #include <stdio.h> //getchar() #include <tchar.h> #include <stdlib.h> ...

  9. 归纳整理Linux下C语言常用的库函数----字符串转换、字符测试、及内存控制

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

随机推荐

  1. webRTC脱坑笔记(四)— windows下Nginx对Node服务的反向代理

    Nginx反向代理 1.什么是反向代理 当我们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集群服务器的时候无法访问,必须通过第三方服务器才能访问 ...

  2. python代码整体左移或右移

    IDE 是  PyCharm 选中代码块: 1)右移:直接 Tab 2)左移:Shift + Tab

  3. php nl2br()函数 语法

    php nl2br()函数 语法 作用:在字符串中的新行(\n)之前插入换行符dd马达 语法:nl2br(string,xhtml) 参数: 参数 描述 string 必须.规定要检查的字符串. xh ...

  4. Sqlachemy的警告SAWarning: The IN-predicate on "sns_object.BIZ_ID" was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate.

    我在使用db_session.query,查询的时候idlist是个空值时候,执行下面的语句就会出现警告.其中后面delete(synchronize_session=False)是删除前面的一堆查询 ...

  5. Docker问题方案收集

    1.问题: Unable to connect to unix:///var/run/docker.sock (Permission denied) from PHP code 解决方法: Make ...

  6. 建站手册-浏览器信息:Mozilla Firefox 浏览器

    ylbtech-建站手册-浏览器信息:Mozilla Firefox 浏览器 1.返回顶部 1. http://www.w3school.com.cn/browsers/browsers_firefo ...

  7. Gradle Wrapper 介绍

    回顾 上一篇介绍了如何使用 Gradle 快速创建 Java 项目,开始讲 Gradle Wrapper 之前先来重温一下通过 gradle init 命令创建的 Java 项目目录结构 ├── bu ...

  8. SSL证书部署HTTPS站点Apache/Nginx配置

    SSL证书及HTTPS协议 SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现:1.数据信息在客户端和服务器之间的 ...

  9. 转 mysql 远程连接数据库的二种方法

    mysql 远程连接数据库的二种方法   一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5.116),端口“3306”,用户名为“root”,密码“123456” ...

  10. Springboot03-异常处理

    springboot默认异常处理 Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并然后返回一个固定的错误页面 统一异常处理 创建全局异常处理类 @ ...