1. 程式人生 > >標準c++實現CString類和TCHAR

標準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++實現CStringTCHAR

程式要從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++實現CStringstring的互相轉換

備忘:為了適用於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#的時候經常會看到一個名詞“抽象類”,那什麼是抽象類,抽象類是用來幹什麼的,在看了很多部落格和資料,都說的很官方,理解起來很難,並且好多部落格資料都是不斷地抄襲抄襲,寫的千篇一律,基本都很相似,那下面小編就根據自己的理解說以下抽象來,結合抽象類把抽象方法也說了。 抽象方