標準c++實現CString類和TCHAR
程式要從windows下移植到linux下,CFlie類還好說,用到的地方比較集中,統一改成fstream就好,最坑的就數這個CString類了,分佈在各個檔案中,只好實現一個CString類。程式碼主要借鑑了網上的程式碼不是我重頭寫的,借鑑了好幾個,就不列出出處了,如果你發現是你的程式碼請告訴我,我加上出處,謝了先!還有TCHAR也比較難搞,網上有大神給出了實現,我就直接粘過來用了,一併謝過!
CString.h
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* File: CString.h
* Author: bqh
*
* Created on November 19, 2018, 4:05 PM
*/
#ifndef CSTRING_H
#define CSTRING_H
#include <string>
#include <assert.h>
using namespace std;
class CString {
friend CString operator + (const char *pStr, const CString &r);
public:
CString ();
CString(const char *p);
CString(const CString &c);
~CString();
public:
char *StrCpy(const char *pStrSrc);
char *StrCpy(const CString &r);
CString &operator=(const char *p);
CString &operator=(const CString &m);
CString operator + (const CString &r) const; //obj + obj
CString operator +(const char *pStr) const; // obj + "String"
CString operator += (const CString &r); // obj += obj
CString operator += (const char *pStr); // obj += "String"
bool operator==(CString &m);
bool operator>=(CString &m);
void Display();
int GetLength();
char *GetBuffer();
CString Left(int len);
CString Right(int len);
bool Compare(CString &strDes);
bool Compare(char *sDes);
int Find(char *strSub,int nstart=0);
int ReverseFind(char *str);
CString Replace(char *subOld,char *subNew,int start=0);
CString Delete(int nIndwx,int nCount =1);
CString Insert(int nIndex,char *pstr);
CString Remove(char *pstr,int start=0);
CString Mid(int nFirst,int nEnd);
CString Trim(char *strDest,int nstart);
private:
char* m_pStr;
int m_len;
char* GetStr();
char *Add(const char *pStr, int nBufSize) const;
char *Copy(const char *pStrSrc);
void Release();
};
#endif /* CSTRING_H */
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* File: CString.cpp
* Author: bqh
*
* Created on November 19, 2018, 4:05 PM
*/
#include "CString.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
using namespace std;
CString::CString()
{
m_pStr = NULL;
m_len = 0;
}
CString::CString(const char *p)
{
m_pStr = NULL;
m_len = 0;
if(p != NULL)
{
StrCpy(p);
}
}
CString::CString(const CString &c)
{
m_pStr = NULL;
m_len = 0;
if(this == &c)
{
return;
}
if(c.m_len != 0)
{
StrCpy(c.m_pStr);
}
}
char *CString::Add(const char *pStr, int nBufSize) const
{
char *pBuf = new char[nBufSize];
char *pTemp = pBuf;
for(int i = 0; i < m_len; i++)
{
pTemp[i] = m_pStr[i];
}
if(NULL != pStr)
{
int j = 0;
for(int i = m_len; j < nBufSize - m_len; j++, i++)
{
pTemp[i] = pStr[j];
}
}
return pBuf;
}
CString::~CString()
{
delete [] m_pStr;
}
char * CString::GetStr()
{
return m_pStr;
}
int CString::GetLength()
{
return m_len;
}
void CString::Release() //初始化函式
{
if(NULL != m_pStr)
{
delete []m_pStr;
m_pStr = NULL;
m_len = 0;
}
}
char* CString::Copy(const char *pStrSrc) //字串複製
{
char *pStr = m_pStr;
for(; '\0' != (*pStr++ = *pStrSrc++); );
return m_pStr;
}
//字串複製string
char* CString::StrCpy(const char *pStrSrc)
{
if(NULL != pStrSrc)
{
Release();
m_len = strlen(pStrSrc);
m_pStr = new char[m_len + 1];
Copy(pStrSrc);
}
return m_pStr;
}
//字串複製obj
char* CString::StrCpy(const CString &r)
{
Release();
if(0 != r.m_len)
{
m_len = r.m_len;
m_pStr = new char[m_len + 1];
Copy(r.m_pStr);
}
return m_pStr;
}
//賦值運算子過載
CString& CString::operator = (const CString &r) //引數為CString物件
{
if(this != &r) //若不是將自己給自己
{
if(0 != r.m_len)
{
StrCpy(r); //使用字串函式過載函式
//StrCpy(r.m_pStr);
}
}
return *this;
}
//賦值運算子過載
CString& CString::operator = (const char *pStr) //引數為字串,如果不寫這個,系統自動呼叫預設字串過程例子:
{ //obj = "test" ->(1)臨時物件 = CString("test"); (2)obj = 臨時物件
if(NULL != pStr) //如果寫了這個函式,就省去了上面的臨時物件過程,稱作以程式碼空間換取效率
{
StrCpy(pStr);
}
return *this;
}
bool CString::operator==(CString &m)
{
char *sSoure = m.GetStr();
if (strcmp(m_pStr, sSoure))
return false;
else
return true;
}
CString CString::operator +(const CString &r) const //obj + obj
{
CString obj;
if(NULL != m_pStr && NULL != r.m_pStr)
{
char *pBuf = Add(r.m_pStr, m_len + r.m_len+1);
obj = pBuf;
delete []pBuf;
}
return obj;
}
CString CString::operator +(const char *pStr) const // obj + "String"
{
CString obj;
if(NULL != m_pStr && NULL != pStr)
{
int nSize = (NULL != pStr)?strlen(pStr):0;
char *pBuf = Add(pStr, m_len+nSize+1);
obj = pBuf;
delete []pBuf;
}
return obj;
}
CString operator + (const char *pStr, const CString &r) //"String" + obj
{
if(NULL != pStr && NULL != r.m_pStr)
{
CString temp = pStr;
return temp+r;
}
return NULL;
}
CString CString::operator += (const CString &r) // obj += obj
{
*this = *this + r;
return *this;
}
CString CString::operator += (const char *pStr) // obj += "String"
{
*this = *this + pStr;
return *this;
}
char * CString::GetBuffer()
{
char *p;
p = new char[m_len];
for (int i = 0; i < m_len; i++)
*(p + i) = *(m_pStr + i);
return p;
}
CString CString::Left(int len)
{
if (len > m_len)
len = m_len;
char *p;
p = new char[len];
for (int i = 0; i < len; i++)
*(p + i) = *(m_pStr + i);
CString strRet(p);
return strRet;
}
CString CString::Right(int len)
{
int j = 0;
if (len > m_len)
len = m_len;
char *p;
p = new char[len];
for (int i = m_len - len; i < m_len; i++)
{
*(p + j) = *(m_pStr + i);
j++;
}
CString strRet(p);
return strRet;
}
void CString::Display()
{
//cout << m_pStr << endl;
}
bool CString::Compare(CString &strDes)
{
char *p = strDes.GetStr();
if (!strcmp(m_pStr, p))
return true;
else
return false;
}
bool CString::Compare(char *sDes) //比較子串是否相等;
{
if (!strcmp(m_pStr, sDes))
return true;
else
return false;
}
int CString::Find(char *subStr, int start) //從start開始,查詢子串subStr的第一個位置.
{
assert(start < m_len);
int i = start;
int j = 0, pos = 0, len = strlen(subStr);
if (len > m_len)
return -1;
else
{
while (m_pStr[i] != '\0')
{
if (m_pStr[i] != subStr[j])
{
i++;
j = 0; //從下一個字串開始比較
}
else //有相同的字串
{
if (j == 0)
pos = i;
i++;
j++;
if (j == len)
return pos;
if (i == m_len)
return -1;
}
}
return -1;
}
}
int CString::ReverseFind(char *str)
{
int ret = -1;
for(int i = m_len - 1; i > -1; i--)
{
if(m_pStr[i] == str[0])
{
ret = i;
break;
}
}
return ret;
}
CString CString::Replace(char *subOld, char *subNew, int start) //返回替換後新的字串
{
int i;
int pos = Find(subOld, start);
if (pos == -1)
return *this; //表明沒有替換的,返回原來的串;
else //表明有子串,位置為pos;
{
char *p1, *p2;
if (pos >= 1)
{
p1 = new char[pos + 1]; //長度+1;
for (i = 0; i < pos; i++)
p1[i] = m_pStr[i];
p1[i] = '\0';
}
else
p1 = "";
if ((pos + (int) strlen(subOld)) < m_len) //說明後面還有字串
{
int j = 0;
p2 = new char[m_len - pos - (int) strlen(subOld) + 1];
for (i = pos + (int) strlen(subOld); i < m_len; i++)
{
*(p2 + j) = *(m_pStr + i);
j++;
}
p2[j] = '\0';
}
else
p2 = "";
char *p3 = new char[(int) strlen(subNew) +(int) strlen(p2)];
strcpy(p3, subNew);
strcat(p3, p2);
char *p4 = new char[(int) strlen(p3) +(int) strlen(p1)];
strcpy(p4, p1);
strcat(p4, p3);
delete p1;
delete p2;
CString strRet(p4);
return strRet;
}
}
CString CString::Delete(int nIndex, int nCount)//刪除從nIndex開始的nCount個字元,得到新的的字串.
相關推薦
標準c++實現CString類和TCHAR
程式要從windows下移植到linux下,CFlie類還好說,用到的地方比較集中,統一改成fstream就好,最坑的就數這個CString類了,分佈在各個檔案中,只好實現一個CString類。程式碼主要借鑑了網上的程式碼不是我重頭寫的,借鑑了好幾個,就不列出出處了,如果你發現是你的程式
【轉】標準C++類std::string的內存共享和Copy-On-Write技術
信息 在哪裏 主程序 分析 ash 3.4 alloc 是否 今天 1、 概念
Scott Meyers在《More Effective
C++》中舉了個例子,不知你是否還記得?在你還在上學的時候,你的父母要你不要看電視,而去復習功課,於是你
C 和 C++ 的標準庫分別有自己的 locale 操作方法,C 標準庫的 locale 設定函式是 setlocale(),而 C++ 標準庫有 locale 類和流物件的 imbue() 方法(gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People
轉自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/
[在此向原文作者說聲謝謝!若有讀者看到文章轉載時請寫該轉載地址,不要寫我的BLOG地址。尊重他人的勞動成果 ^_^ ]
C 和 C++ 的標準庫分別有自己的
C++中,類和函式分開定義宣告和實現的方法
test.hpp
#include <map>
#include <queue>
#include <string>
#include <vector&g
C++實現CString和string的互相轉換
備忘:為了適用於Unicode環境,要養成使用_T()巨集的習慣
1、格式化字串
CString s;
s.Format(_T("The num is %d."), i);
2、轉為 int
轉10進位制最好用_ttoi(),它在 ANSI 編碼系統中被編譯成_atoi(),而在 Unicode 編碼系統
標準C++類std::string的記憶體共享和Copy-On-Write技術
1、概念
Scott Meyers在《More Effective C++》中舉了個例子,不知你是否還記得?在你還在上學的時候,你的父母要你不要看電視,而去複習功課,於是你把自己關在房間裡,做出一副正在複習功課的樣子,其實你在幹著別的諸如給班上的某位女生寫情書之類的
4.6 C++抽象基類和純虛成員函數
中新 error isp ... 先來 必須 pub 對象 c++ 參考:http://www.weixueyuan.net/view/6376.html
總結:
在C++中,可以通過抽象基類來實現公共接口
純虛成員函數沒有函數體,只有函數聲明,在純虛函數聲明結尾加
7.C#知識點:抽象類和接口淺談
public 註意 animal 繼承 一份 進行 target log 兩個 知識點目錄==========>傳送門
首先介紹什麽是抽象類?
抽象類用關鍵字abstract修飾的類就是叫抽象類,抽象類天生的作用就是被繼承的,所以不能實例化,只能被繼承。而且
C#的抽象類和接口,區別與相似
serve 層次 一次 否則 聲明 多個 析構函數 而在 比喻
一、抽象類:抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們
C#中父類和子類之間相互轉換
mage all spa 分享 mic ack 子類 utl round 所用到的類文件:Person.cs:Student.cs:Teacher.cs:問題1:總結:1 父類不能直接強制轉換成子類2 只有父類對象指向子類,那麽父類是可以強制轉換成子類,如果父類對象沒有指向
C++實現string類型的大數相加(帶小數)
字符 urn sin 個數 dem 做了 優化 count 變量 近日,做了一道阿裏給的大數相加的編程題。題目大意如下:
輸入兩個string類型的數,如12.223 11,判斷輸入字符串是否合法。合法則輸出true以及相加結果(true 23.223),非法則輸出fal
C++中的類和物件(一)
https://www.cnblogs.com/metalsteel/p/6266505.html
一,類的概念及封裝
1.什麼是封裝
第一層含義:封裝是面向物件程式設計最基本的特性。把資料(屬性)和函式(方法)合成一個整體,這在計算機世界中是用類和物件實現的。(把屬性和方法進行封
一個簡單的C++實現有理數類的例子
這次本來是老師佈置的一個作業,老師提前把main.cpp給了我們,要求我們在標頭檔案中定義並且實現一個有理數類,使得執行程式後輸出的結果跟他給的一樣。 main.cpp如下:
#include <stdio.h>
#include "Rational.h"
int main()
{
Ra
【C++初學】類和物件定義與建構函式
一.類和物件定義 class 型別名 { public: 公有成員(外部介面) private: 私有成員(只允許類內函式訪問,有後續操作) protected: 保護成員
二.建構函式 def:給物件進行初始化的函式。 gra: 函式名與類名相同; 無返回值(return); 1.委託
c++基礎2——類和物件
1、class的構成
class 類名{ public://公有成員 函式1; 變數1; ……
C++——設計佇列類和迴圈佇列類
設計佇列類和迴圈佇列類 要求: 能夠設計佇列類和迴圈佇列類,實現儲存和取數功能。 Append:加入佇列,將一個元素加入到佇列的後面 Get:讀取佇列,從佇列前面讀取並刪除一個元素 IsEmpty:判斷佇列是否為空 IsFull:判斷佇列是否已滿 Traverse:遍歷,從頭至尾訪問佇列的每
【C++】初學類和物件的概念
C++中的類Class可以看作C語言中結構體的升級版。結構體是一種構造型別,它可以包含若干成員變數,而其中每個成員變數的型別又可以不同。例如:
struct Student
{//結構體包含的成員變數
char *name;
int age;
float score;
};
void D
C++實現分數類
在幾乎所有的語言中(至少我知道的語言都是這樣),浮點數都是有精度丟失的。
怎麼解決呢?
分數類就是解決辦法之一。
分數類採用分數的形式,儲存了兩個整數之比,確保了精度。
C#之抽象類和抽象方法
一、前言
在學習C#的時候經常會看到一個名詞“抽象類”,那什麼是抽象類,抽象類是用來幹什麼的,在看了很多部落格和資料,都說的很官方,理解起來很難,並且好多部落格資料都是不斷地抄襲抄襲,寫的千篇一律,基本都很相似,那下面小編就根據自己的理解說以下抽象來,結合抽象類把抽象方法也說了。
抽象方