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兩個標准

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM