天天看点

简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)

上次说到我的MFC作业:

​​​MFC计算器最简单版本(我的计算器1.1,和同学交流的结果)​​​​MFC简单计算器(我的实验报告1.2版本)​​ 实验内容:

可以在多个题目中选择一个:

1、编写一本通信录

2、模拟简单计算器√

3、简单的管理系统的设计:如人事、工资、学生成绩等。(要求部分功能实现)。

4、迷宫生成器

1.对实验结果进行分析

虽然我设计的MFC计算器,这是苦熬的2天3夜后结果,并没有很多花哨的功能,但把所有基本的功能都实现了,从实验的结果来看,实验结果与预期达到一致,实现了一些±*/这些功能,并且都是使用了极为简洁的代码,运用了CStringArray实现了多次计算,并且还注重了程序的完美。

按顺序添加控键代码,方便阅读和使用。这篇价值还是有的,觉得不错给个赞。但是, 其中是由bug的,但没时间和精力搞了,只能留给路过的大佬了,或者只能之后的自己搞了。就是kf 开方,我虽然实现了计算,但不能9kf+1或1+9kf的运算。

2、完成编写相关实验代码

①.整体框架的设计

1)首先,这个就是运行的可视化效果图

简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)

2)功能比较多,设置了2个编辑框,一个存放时间(打开软件的时间),一个是显示计算过程和结果。数据和运算符都是单行显示。最难的是控键的空行设置和传递值。

2)功能比较多,设置了2个编辑框,一个存放时间(打开软件的时间),一个是显示计算过程和结果。数据和运算符都是单行显示。最难的是控键的空行设置和传递值。

②.编写代码前的准备工作

简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)

在右边的编辑框添加变量,m_edit是控件,Cstring类型;m_edit_text是double类型的值。右边编辑框要改一下属性中的MultiLine 改为true,要可以换行。

③.代码的编写(主要的解释会在每个代码段里呈现)

增加头文件:#include<cmath>
控键0-9,按下面代码填写
void CMFCApplication11Dlg::OnBnClickedButton1()
{
  m_edit_text.Append(_T("1"));//编辑框页面增加‘1’
  UpdateData(FALSE);//显示到编辑框了
}
增加了Π和e的控键
void CMFCApplication11Dlg::OnBnClickedButton13()// Π
{
  // TODO: 在此添加控件通知处理程序代码
  m_edit_text.Append(_T("3.14159265359"));
  UpdateData(FALSE);
}

void CMFCApplication11Dlg::OnBnClickedButton11()//    e
{
  // TODO: 在此添加控件通知处理程序代码
  m_edit_text.Append(_T("2.718282"));
  UpdateData(FALSE);
}


小数点’.’:

void CMFCApplication11Dlg::OnBnClickedButtonpoint()
{
  if (m_edit_text.Find(_T(".")) == -1) {
/* 加个判断,如果编辑框控键中数据中发现已有小数点,就不增加小数点*/
    m_edit_text.Append(_T("."));
  }
    UpdateData(FALSE);
}

完善功能键
+:
void CMFCApplication11Dlg::OnBnClickedButtonadd()
{
  m_edit_text.Append(_T("\r\n"));//‘+’和上个数据换行
  m_edit_text.Append(_T("+"));
  m_edit_text.Append(_T("\r\n"));//和下一行数据分隔开
  UpdateData(FALSE);
}
-:
void CMFCApplication11Dlg::OnBnClickedButtonsub()
{

  m_edit_text.Append(_T("\r\n"));
  m_edit_text.Append(_T("-"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}
*:
void CMFCApplication11Dlg::OnBnClickedButtonmul()
{
  m_edit_text.Append(_T("\r\n"));
  m_edit_text.Append(_T("*"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}
/:

void CMFCApplication11Dlg::OnBnClickedButtondiv()
{
  m_edit_text.Append(_T("\r\n"));
  m_edit_text.Append(_T("/"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}

后退:

void CMFCApplication11Dlg::OnBnClickedButtonback()
{
  m_edit_text.Delete(m_edit_text.GetLength() - 1);
  UpdateData(FALSE);
}
清零:

void CMFCApplication11Dlg::OnBnClickedButtonclear()
{
  m_edit_text.Empty();
  UpdateData(false);
}
阶乘:


void CMFCApplication11Dlg::OnBnClickedButtonjiecheng()
{
  m_edit_text.Append(_T("\r\n"));
  m_edit_text.Append(_T("!"));
  UpdateData(FALSE);
}
Sin:

void CMFCApplication11Dlg::OnBnClickedButtonsin()
{
  m_edit_text.Append(_T("sin"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}
Cos:
void CMFCApplication11Dlg::OnBnClickedButtoncos()
{
  m_edit_text.Append(_T("cos"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}
Tan:

void CMFCApplication11Dlg::OnBnClickedButton31()
{
  m_edit_text.Append(_T("tan"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}
%:
void CMFCApplication11Dlg::OnBnClickedButton30()//  %
{
  m_edit_text.Append(_T("\r\n"));
  m_edit_text.Append(_T("%"));
  UpdateData(FALSE);
}
About:

void CMFCApplication11Dlg::OnBnClickedButtonabout()
{
  CAboutDlg dlg;
  dlg.DoModal();
}
开方:
Kf:
void CMFCApplication11Dlg::OnBnClickedButtonkaifang()
{
  m_edit_text.Append(_T("\r\n"));
  m_edit_text.Append(_T("kf "));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}

开n次方:
Kn:
void CMFCApplication11Dlg::OnBnClickedButton26()
{
  m_edit_text.Append(_T("\r\n"));
  m_edit_text.Append(_T("kn"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}
Log:


void CMFCApplication11Dlg::OnBnClickedButtonlog()
{
  m_edit_text.Append(_T("lg"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}
Ln:

void CMFCApplication11Dlg::OnBnClickedButtonln()
{
  m_edit_text.Append(_T("ln"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}
^:(几次方)

void CMFCApplication11Dlg::OnBnClickedButton12()
{
  m_edit_text.Append(_T("\r\n"));
  m_edit_text.Append(_T("^"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}

e^n:
void CMFCApplication11Dlg::OnBnClickedButton29()//e^n
{
  m_edit_text.Append(_T("e^"));
  m_edit_text.Append(_T("\r\n"));
  UpdateData(FALSE);
}

最重要的是’=’
double a, b, c; CStringArray  arr;
void CMFCApplication11Dlg::OnBnClickedButtonequal()
{
  int i, nLineCount = m_edit.GetLineCount();//m_myEdit是与edit控件关联的变量
  //p = new int[nLineCount];
  /*CString h;
  h.Format(_T("%d"), nLineCount);
  MessageBox(h);*/
  CString strText;//, strLine;
  // Dump every line of text of the edit control.
  for (i = 0; i < nLineCount; i++)
  {
    int len = m_edit.LineLength(m_edit.LineIndex(i));  // length of line i:
    m_edit.GetLine(i, strText.GetBuffer(len), len);
    arr.SetAtGrow(i, strText);
  }

  int nLong = arr.GetSize();

  //  ^  !  sin  cos  tan   %  ^2   kf  kn  log   ln  e^n  

  for (i = 0; i < nLong; i++)
  {
    int len = arr[i].GetLength();
  // CHAR* tr = arr[i].GetBuffer(len);
    TCHAR* tr = arr[i].GetBuffer(len);
       CString s;
********************************************************************^  !
    if (tr[0] == '^')
    {
      
        a = _ttof(arr[i - 1]);
        b = _ttof(arr[i + 1]);
        c = pow(a, b);
        s.Format(_T("%lf"), c);
        arr[i] = s;
        arr.RemoveAt(i + 1);
        arr.RemoveAt(i - 1);
      i = 0;
    }

    if (tr[0] == '!')
    {
      a = _ttof(arr[i - 1]);
      //b = _ttof(arr[i + 1]);
      double temp=1;
      for (int i = 1; i <= a; i++)
      {
        temp *= i;
      }
      c = temp;
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s; //MessageBox(s);
      //arr.RemoveAt(i + 1);
      arr.RemoveAt(i - 1);
      i = 0;
    }

*************************sin cos  tan  % 
    if (tr[0] == 's')//按字符搜索,只能选运算符的第一个字母

    {
      //a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
    double  num = (b*3.1415926) / 180; c= sin(num);
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      arr.RemoveAt(i + 1); //MessageBox(arr[i]);
      //arr.RemoveAt(i - 1);
      //i = 0;
    }

    if (tr[0] == 'c')    {
      //a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      double  num = (b*3.1415926) / 180; c = cos(num);
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s; 
      arr.RemoveAt(i + 1);
      //arr.RemoveAt(i - 1);
      i = 0;
    }


    if (tr[0] == 't')
    {
      //a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      double  num = (b*3.1415926) / 180; c = sin(num)/cos(num);
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s; //MessageBox(arr[i]);
      arr.RemoveAt(i + 1);
      //arr.RemoveAt(i - 1);
      i = 0;
    }


    if (tr[0] == '%')
    {
      a = _ttof(arr[i - 1]);
      //b = _ttof(arr[i + 1]);
      c = a *0.01;
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      //arr.RemoveAt(i + 1);
      arr.RemoveAt(i - 1);
      i = 0;
    }
    
    
    *******************************kf kn 

    if (tr[0] == 'k'&&tr[1]=='f')
/*因为kf 和kn存在第一个字符一样会导致二义性,所以还要判断第二个字符*/
    {
      a = _ttof(arr[i - 1]);
    m_edit_text.Empty();  
    double f = _ttof(arr[0]);
      CString g;
      if (f - int(f) <= 1e-5)
      {
        g.Format(_T("%d"), (int)f);
      }
      else
      {
        g.Format(_T(" %f"), f);
      }
      m_edit_text.Append(g);
      m_edit_text.Append(_T("\r\n"));
      m_edit_text.Append(_T("kf"));
      UpdateData(FALSE);
      c = sqrt(a);
      CString s;
      s.Format(_T("%lf"), c);
      //arr[i-1] = s;
      //arr.RemoveAt(i + 1);
      arr.RemoveAll();
      arr.SetAtGrow(0, s);
      //arr.RemoveAt(i+1);
    }
    if (tr[0] == 'k'&&tr[1]=='n')
    {
      a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      c = pow(a, 1/b);
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s; 
      arr.RemoveAt(i + 1);
      arr.RemoveAt(i - 1);
      i = 0;
    }
******************ln和Ln
    if (tr[1] == 'g'&&tr[0]=='l')
    {
      //a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      c = log10(b);
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      arr.RemoveAt(i + 1);
      //arr.RemoveAt(i - 1);
      
    }
    if (tr[1] == 'n'&&tr[0]=='l')
    {
      //a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      c = log(b);
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      arr.RemoveAt(i + 1);
      //arr.RemoveAt(i - 1);
      i = 0;
    }

*******************************e^n
    if (tr[0] == 'e')
    {
      //a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      c = exp(b);
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      arr.RemoveAt(i + 1);
      //arr.RemoveAt(i - 1);
      i = 0;
    }
    nLong = arr.GetSize();


  }
  
//  * 和/运算符

*********************************  * /
  for (i = 0; i < nLong; i++)
  {
    int len = arr[i].GetLength();
    TCHAR* tr = arr[i].GetBuffer(len);
    if (tr[0] == '*')
    {
      a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      c = a * b;
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      arr.RemoveAt(i + 1);
      arr.RemoveAt(i - 1);
      i = 0;
    }
    if (tr[0] == '/')
    {
      a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      if (b ==0) {
        MessageBox(_T("分母不为0"));
        c = 0;
      }
      c = a / b;
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      arr.RemoveAt(i + 1);
      arr.RemoveAt(i - 1);
      i = 0;
    }
    nLong = arr.GetSize();
  }


  //  +和-运算


  for (i = 0; i < nLong; i++)
  {
    int len = arr[i].GetLength();
    TCHAR* tr = arr[i].GetBuffer(len);
    arr[i].ReleaseBuffer();
    if (tr[0] == '+')
    {
      a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      c = a + b;
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      arr.RemoveAt(i + 1);
      arr.RemoveAt(i - 1);
      arr.FreeExtra();
      i = 0;
    }
    if (tr[0] == '-')
    {
      a = _ttof(arr[i - 1]);
      b = _ttof(arr[i + 1]);
      c = a - b;
      CString s;
      s.Format(_T("%lf"), c);
      arr[i] = s;
      arr.RemoveAt(i + 1);
      arr.RemoveAt(i - 1);
      arr.FreeExtra();
      i = 0;
    }
    nLong = arr.GetSize();
  

    if (nLong == 1)//计算器编辑框数据只剩一位时,显示换行再“=”再换行显示结果
    {
      m_edit_text.Append(_T("\r\n"));
      m_edit_text.Append(_T("="));
      m_edit_text.Append(_T("\r\n"));
      CString s; 
      s = arr[0];
      double result = _ttof(s);
      if (result- int(result) <= 1e-5)
      {
        s.Format(_T("%d"), (int)result);
      }
      else
      {
        s.Format(_T(" %f"), result);
      }
      arr[0] = s;
      m_edit_text.Append(arr[0]);
      UpdateData(FALSE);
    }
  }
}      

特效1:最小化:

void CMFCApplication11Dlg::OnBnClickedButton14()
{
  AfxGetMainWnd()->CloseWindow();
}      
简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)
简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)

特效2:显示时间:

1.找到BOOL CMFCApplication11Dlg::OnInitDialog()函数,增加代码

BOOL CMFCApplication11Dlg::OnInitDialog()
{
  CDialogEx::OnInitDialog();

  CString strTime;
  CTime tm;
  tm = CTime::GetCurrentTime();         //获取当前系统时间
  strTime = tm.Format("%y年%m月%d日 %X");   //格式化系统时间。即使系统时 间按照Format中设置的格式显示
  SetDlgItemText(IDC_EDIT4, strTime);        //初始化编辑框显示
  SetTimer(1, 1000, NULL);         //启动定时器      

2.CMFCApplication11Dlg.h头文件里增加

afx_msg void CMFCApplication11Dlg::OnTimer(UINT_PTR nIDEvent);      
简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)

3.再回到CMFCApplication11Dlg.cpp文件里

void CMFCApplication11Dlg ::OnTimer(UINT_PTR nIDEvent)
{
  // TODO:  在此添加消息处理程序代码和/或调用默认值
  CString strTime;
  CTime tm;
  tm = CTime::GetCurrentTime();
  strTime = tm.Format("%Y-%m-%d %H:%M:%S");
  SetDlgItemText(IDC_EDIT4, strTime);        //显示系统时间
  CMFCApplication11Dlg::OnTimer(nIDEvent);
}      
简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)

特效3:退出

void CMFCApplication11Dlg::OnBnClickedButtonononcancel()
{
  if (MessageBox(_T("确认退出"), _T(""), MB_YESNO | MB_ICONQUESTION) == IDYES) {
    this->SendMessage(WM_CLOSE);
  }
}      
简单MFC计算器(字符串形式,基于vs2017 我的实验报告版本1.3)

3、对本次实验要有总结

注意:要求在系统设计阶段对数据结构(主要是类的结构及类之间的联系)进行分析研究,充分利用面向对象的特性,使类结构尽可能合理和高效。

重要的函数:

1.m_edit_text.Append(_T("\r\n"));
2.m_edit_text.Delete(m_edit_text.GetLength() - 1);
3.m_edit_text.Empty();
4.int nLineCount = m_edit.GetLineCount();
5.Int  len = m_edit.LineLength(m_edit.LineIndex(i));//length of line i:
    6.m_edit.GetLine(i, strText.GetBuffer(len), len);
    7.arr.SetAtGrow(i, strText);
8.arr.RemoveAt(i + 1);
      arr.RemoveAt(i - 1);
9.arr.FreeExtra();

如文中:
for (i = 0; i < nLineCount; i++)
  {
    int len = m_edit.LineLength(m_edit.LineIndex(i));  // length of line i:
    m_edit.GetLine(i, strText.GetBuffer(len), len);
    arr.SetAtGrow(i, strText);
  }
10.if (f - int(f) <= 1e-5)
      {
        g.Format(_T("%d"), (int)f);
      }
      else
      {
        g.Format(_T(" %f"), f);
      }
把结果好看化,不需要“.000000”就去掉后面的,直接int化输出

按行字符串,存储再arr[i]中,CStringArray  arr;      

——————————————————————————————————————

相关知识:(方便自己以后看的)

CStringArray--字符串数组类
CStringArray类支持CString对象数组。
在使用一个数组之前,使用SetSize来建立它的大小并给它分配内存。如果你不使用SetSize,则向数组中添加元素时将导致数组被频繁地拷贝和分配内存。频繁分配内存和拷贝会导致效率低和内存零碎。
如果你需要数组中个别字符串元素的转储,则应该将转储环境的深度设置为1或更大。当一个CString数组被删除时,或当其中的个别元素被删除时,字符串内存被根据需要释放。
CStringArray类成员
构造
CStringArray构造一个空的CString对象数组
绑定
GetSize 获取这个数组中的元素数目
SetSize 设置这个数组中包含的元素数目
GetUpperBound 返回最大的有效索引
操作符
FreeExtra 释放当前数组边界之外的未使用的所有内存
RemoveAll 从数组中删除所有元素
元素访问
GetAt 返回位于给定索引处的值
SetAt 设置给定索引处的元素的值;不得将数组增大
ElementAt 返回对数组中的某一元素指针的临时引用
GetData 对数组中的元素允许的访问。可以是NULL
扩大数组
SetAtGrow 设置给定索引处的值,如果必要的话可以增长数组
Add 在数组的末尾添加一个元素;可根据需要增长数组
Append 向数组中添加另一个数组;如果必要的话可增长数组
Copy 将另一个数组拷贝到此数组中;如果必要的话可增长数组
插入/删除
InsertAt 在指定索引处插入一个元素(或者是另一个数组中的所有元素)
RemoveAt 删除指定索引处的一个元素
操作符
operator []      

相关函数:

1、构造函数(常用)

CString( const unsigned char* psz );
  例:char s[]="abcdef";
          char* sp=s;
          CString csStr(sp);
  //csStr="abcdef"
  CString( LPCSTR lpsz );
  例:CString csStr("abcdef");
  //csStr="abcdef"
 CString( LPCWSTR lpsz );
 例: CString csStr(L"abcdef");
 //csStr=L"abcdef"
 CString( LPCTSTR lpsz );
 例: CString csStr(_T("abcdef"));
 //csStr=_T("abcdef")
 CString( LPCTSTR lpch,  int nLength );
 例:CString csStr("abcdef", 3);
 //csStr="abc"
 CString( TCHAR ch,  int nRepeat = 1 );
 例:CString csStr(_T('a'), 5);
 //csStr="aaaaa"      

2、

int GetLength( ) const;
      unicode字符集下返回字符个数,ansi字符集下返回字符长度,不包含结尾的空字符。
      例:csStr="AB中文12";
      printf("%d",csStr.GetLength());       //UNICODE下为6,ANSI下为8      

3、

int Find( TCHAR ch ) const;
      int Find( LPCTSTR lpszSub ) const;
      int Find( TCHAR ch, int nStart ) const;
      int Find( LPCTSTR pstr, int nStart ) const;
      查找字串,nStart为开始查找的位置。未找到匹配时返回-1,否则返回字串的开始位置
      例:csStr="abcdef";
              cout<<csStr.Find('b');       //1
              cout<<csStr.Find("de");      //3
              cout<<csStr.Find('b',3);     //-1
              cout<<csStr.Find('b',0);     //1
              cout<<csStr.Find("de",4);    //-1
              cout<<csStr.Find("de",0);    //3
      //当nStart超出对象末尾时,返回-1。
      //当nStart为负数时,返回-1。
      int FindOneOf( LPCTSTR lpszCharSet ) const;
      查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置
      例:csStr="abcdef";
              cout<<csStr.FindOneOf("cxy");      //2
      int ReverseFind( TCHAR ch ) const;
      从后向前查找第一个匹配,找到时返回下标。没找到时返回-1
      例:csStr="abba";
              cout<<csStr.ReverseFind('a');        //3      

4、

CString SpanExcluding( LPCTSTR lpszCharSet ) const;
      返回与lpszCharSet中任意字符匹配的字符之前的子串(找到第一个匹配的字符就返回)
      例:csStr="abcdef";
              cout<<csStr.SpanExcluding("cf");    //ab
      CString SpanIncluding( LPCTSTR lpszCharSet ) const;
      查找与lpszCharSe中任意字符不匹配的字符,并返回不匹配字符之前的字串(找到第一个不匹配的字符就返回)
      例:csStr="abcdef";
              cout<<csStr.SpanIncluding("fdcba");    //abcd
      可以利用SpanIncluding这个特性来判断字符串的合法性,是否是我们要求的字符,比如是否全是数字构成的字符串:
      CString strTarget;
......
if ( strTarget == strTarget.SpanIncluding( _T("0123456789") ) ) 
{
// 字符串由数字构成,符合要求
......
}      

5、

TCHAR GetAt( int nIndex ) const;
      返回下标为nIndex的字符,与字符串的[]用法相同
      例:csStr="abcdef";
              cout<<csStr.GetAt(2);             //c
      //当nIndex为负数或超出对象末尾时,会发生无法预料的结果。
      void SetAt( int nIndex, TCHAR ch );
      给下标为nIndex的字符重新赋值
      例:csStr="abcdef";
              csStr.SetAt(2,'x');
              cout<<csStr;                      //abxdef
      //当nIndex为负数或超出对象末尾时,会发生无法预料的结果。      

6、

CString Left( int nCount ) const;
      从左取字串
      例:csStr="abcdef";
              cout<<csStr.Left(3);          //abc
      //当nCount等于0时,返回空。
      //当nCount为负数时,返回空。
      //当nCount大于对象长度时,返回值与对象相同。
      CString Right( int nCount ) const;
      从右取字串
      例:csStr="abcdef";
              cout<<csStr.Right(3);           //def
      //当nCount等于0时,返回空。
      //当nCount为负数时,返回空。
      //当nCount大于对象长度时,返回值与对象相同。
      CString Mid( int nFirst ) const;
      CString Mid( int nFirst, int nCount ) const;
      从中间开始取字串
      例:csStr="abcdef";
              cout<<csStr.Mid(2);           //cdef
              csStr="abcdef";
              cout<<csStr.Mid(2,3);         //cde
      //当nFirst为0和为负数时,从第一个字符开始取。
      //当nFirst等于对象末尾时,返回空字串。
      //当nFirst超出对象末尾时,会发生无法预料的结果。
      //当nCount超出对象末尾时,返回从nFirst开始一直到对象末尾的字串
      //当nCount为0和为负数时,返回空字串      

7、

void Format( LPCTSTR lpszFormat, ... );
      void Format( UINT nFormatID, ... );
      格式化数据到CString对象,与C语言的sprintf函数用法类似
      例:csStr.Format("%d",13);
              cout<<csStr;                       //13      

8、

void Empty( );
      清空
      例:csStr="abcdef";
              csStr.Empty();
              printf("%d",csStr.GetLength());    //0
      BOOL IsEmpty( ) const;
      测试对象是否为空,为空时返回零,不为空时返回非零
      例:csStr="abc";
              cout<<csStr.IsEmpty();         //0;
              csStr.Empty();
              cout<<csStr.IsEmpty();         //1;      

9、

void MakeReverse( );
      颠倒字符串的顺序
      例:csStr="ABCDEF中文123456";
              csStr.MakeReverse();
              cout<<csStr;                  //654321文中FEDCBA
      void MakeUpper( );
      将小写字母转换为大写字母
      例:csStr="abcdef中文123456";
              csStr.MakeUpper();
              cout<<csStr;                  //ABCDEF中文123456
      void MakeLower( );
      将大写字母转换为小写字母
      例:csStr="ABCDEF中文123456";
              csStr.MakeLower();
              cout<<csStr;                  //abcdef中文123456      

10、

int Compare( LPCTSTR lpsz ) const;
        区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1
        例:csStr="abcdef中文123456";
                csStr2="ABCDEF中文123456";
                cout<<csStr.CompareNoCase(csStr2);             //0
        int CompareNoCase( LPCTSTR lpsz ) const;
        不区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1
        例:csStr="abcdef中文123456";
        csStr2="ABCDEF中文123456";
        cout<<csStr.CompareNoCase(csStr2);             //-1
        CString对象的比较还可以通过==、!=、<;、>;、<=、>=等重载运算符实现。      

11、

int Delete( int nIndex, int nCount = 1 )
        删除字符,删除从下标nIndex开始的nCount个字符
        例:csStr="ABCDEF";
                csStr.Delete(2,3);
                cout<<csStr;              // ABF
        //当nIndex过大,超出对像所在内存区域时,函数没有任何操作。
        //当nIndex为负数时,从第一个字符开始删除。
        //当nCount过大,导致删除字符超出对像所在内存区域时,会发生无法预料的结果。
        //当nCount为负数时,函数没有任何操作。

        int Insert( int nIndex, TCHAR ch )
        int Insert( int nIndex, LPCTSTR pstr )
        在下标为nIndex的位置,插入字符或字符串。返回插入后对象的长度
        例:csStr="abc";
                csStr.Insert(2,'x');
                cout<<csStr;                    //abxc
                csStr="abc";
                csStr.Insert(2,"xyz");
                cout<<csStr;                    //abxyzc
       //当nIndex为负数时,插入在对象开头
       //当nIndex超出对象末尾时,插入在对象末尾

       int Remove( TCHAR ch );
       移除对象内的指定字符。返回移除的数目
       例:csStr="aabbaacc";
               csStr.Remove('a');                cout<<csStr;                    //bbcc

        int Replace( TCHAR chOld, TCHAR chNew );
        int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
        替换字串
        例:csStr="abcdef";
                csStr.Replace('a','x');
                cout<<csStr;                    //xbcdef
                csStr="abcdef";
                csStr.Replace("abc","xyz");
                cout<<csStr;                    //xyzdef

  12、void TrimLeft( );
          void TrimLeft( TCHAR chTarget );
          void TrimLeft( LPCTSTR lpszTargets );
          从左删除字符,被删的字符与chTarget或lpszTargets中字符匹配,一直删到第一个不匹配的字符为止
          例:csStr="aaabaacdef";
                  csStr.TrimLeft('a');
                  cout<<csStr;                //baacdef
                  csStr="aaabaacdef";
                  csStr.TrimLeft("ab");
                  cout<<csStr;                //cdef
         //无参数时删除换行、空格、制表符。

         void TrimRight( );
         void TrimRight( TCHAR chTarget );
         void TrimRight( LPCTSTR lpszTargets );
         从右删除字符,被删的字符与chTarget或lpszTargets中字符匹配,一直删到第一个不匹配的字符为止
         例:csStr="abcdeaafaaa";
         csStr.TrimRight('a');
         cout<<csStr;               //abcdeaaf
         csStr="abcdeaafaaa";
         csStr.TrimRight("fa");
         cout<<csStr;                //abcde
        //无参数时删除换行、空格、制表符。
        void Trim( );
        void Trim( TCHAR chTarget );
        void Trim( LPCTSTR lpszTargets );
        从左和右删除字符,被删的字符与chTarget或lpszTargets中字符匹配,一直删到第一个不匹配的字符为止
        //无参数时删除换行、空格、制表符。      

13、

LPTSTR GetBuffer( int nMinBufLength );
        获取内部字符缓冲区.返回LPTSTR类型指针。参数nMinBufLength指定缓冲区大小,参数为空则为原内部缓冲区大小。
        例:CString str;
               LPTSTR p = str.GetBuffer(100);
               _tcscpy(p, L"abc");
               str.ReleaseBuffer();
               int nLength = str.GetLength();//3
               cout << str;//"abc"
        //使用完GetBuffer后必须使用ReleaseBuffer以更新对象内部数据,CString对象的任 何方法都应在ReleaseBuffer之后调用。与GetBufferSetLength不同的是如果分配的空间大于实际保存的字符串('\0'结尾), ReleaseBuffer会把多余申请的空间释放。
       void ReleaseBuffer( int nNewLength = -1 );
       使用GetBuffer后必须使用ReleaseBuffer以更新对象内部数据,CString对象的任 何方法都应在ReleaseBuffer之后调用
       LPTSTR GetBufferSetLength( int nNewLength );
         获取内部字符缓冲区.返回LPTSTR类型指针。
    例: CString str;
           LPTSTR p = str.GetBufferSetLength(100);
           _tcscpy(p, L"abc");
           str.ReleaseBuffer();
           int nLength = str.GetLength();//3
           cout << str;//"abc"
    //使用完GetBuffer后不必再调用ReleaseBuffer