zoukankan      html  css  js  c++  java
  • 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()]='';                           //需要手动接上结束符

    free(myChp);

    myChp=NULL;

    const char *chData = mystr.data();   ||  const char *chData = mystr.c_str();//常类型使用,string.data()  返回的数据不以''结束&&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两个标准

  • 相关阅读:
    .net 用户控件ascx.cs注册js脚本代码无效果
    Sql-exec
    C# 复制指定节点的所有子孙节点到新建的节点下
    C# 拷贝指定文件夹下的所有文件及其文件夹到指定目录
    svn 命令
    C语言运算符优先级
    两级宏&&字符串化宏
    [C++]#if !defined 的作用
    四面体ply格式文件图和数据对应关系分析
    PLY格式介绍
  • 原文地址:https://www.cnblogs.com/liuruoqian/p/8353555.html
Copyright © 2011-2022 走看看