当前位置:C++技术网 > 资讯 > [字符串完全理解+CString用法大全]字符串提取问题 截取部分

[字符串完全理解+CString用法大全]字符串提取问题 截取部分

更新时间:2017-02-25 23:16:11浏览次数:1+次

CString a=_T("201702251");

现在想把a分割成2部分

CString b =a. Left(6); 提取了前面的时间20170225 ;

后面的 1 是编号,但是编号可能是2位数 也可能是3位数,剩下的部分改如何提取出来呢?


C++技术网会员解答:

    您好,感谢您对C++技术网的支持。

    这个问题确实很简单,只是您对CString或者字符串的使用不太熟悉而已。下面给您详细的说说,让您对字符串操作有一个全面的了解。

    字符串就是在字符后面有一个空字符的字符数组。这个空字符为\0,字符编码值为0。来看一下代码:


char str[100]="123456";
     字符数组str直接赋值初始化一个字符串。字符数组占用100个字节,然而字符串却只占用7个字节。这个说明,字符串和字符数组并不是一回事。字符串只是一个特定约定表示的字符数组序列。也就是一系列字符序列后跟着一个空字符,那么从这串字符到空字符这一系列字符就构成了字符串。


    字符串并不需要占满字符数组。一个字符数组中可以存储很多个字符串。比如从“123456”后面还可以存储"2017"这个字符串,因为才用掉了7个字节而已,还剩下93个字节。我们通过操作空字符就可以进行这样的灵活处理。


char str[100]="123456";
printf(str);//打印字符串123456
str[6]=''-'';//将7个位置的空字符替换为字符-
printf(str);//打印字符串123456-或者123456-乱码,出现乱码是因为字符串初始化时并不一定会将str后面的93个字节设置为0,空字符的编码值就是0
     我们这样就是直接干掉了空字符。如果你想将''-''字符恢复为空字符,可以这样:



str[6]=0;
或
str[6]=''\0'';
     如果你想在str数组中存储两个字符串,可以这样初始化:



char str[100]={''1'',''2'',''3'',''4'',''5'',''6'',''\0'',''2'',''0'',''1'',''7'',''\0''};
     看上去比较怪异,但是非常合理的。这是帮助你理解字符串。下面来看看字符串的处理,让你理解为什么要这么做!



#include "stdio.h"
void main()
{
	char str[100]={''1'',''2'',''3'',''4'',''5'',''6'',''\0'',''2'',''0'',''1'',''7'',''\0''};
	printf(str);//输出字符串123456
	printf("\n");
	str[6]=''-'';
	printf(str);//输出字符串123456-2017
}
    我们在一个字符数组中存入了两个字符串,只不过一开始只显示了一个字符串。我们通过改变空字符,将两个字符串合并为一个字符串了。


    相信通过上面的分析,你对字符串的理解会印象深刻点。而MFC中的字符串或者其他地方使用的字符串也和这个一样。下面来分析MFC的字符串。

    MFC的字符串被封装在了CString。CString封装的特别好,是使用最为频繁的类了,甚至比printf还要让人喜欢。我们可以将CString看成一个字符串,可以直接进行字符的拼接、查找、替换等。我们也可以将CString看成一个字符数组,可以直接通过[]来获取字符,不过不能通过[]来修改字符串的字符的值。

    不管是字符串的截断、提取、查找、修改等操作,无非就是对字符串进行位置查找,然后对这个位置开始的字符进行处理。所以我们在操作字符串的时候,一定要有一个位置的概念。而且操作的时候可以从左到右,也可以从右到左,但是不管是哪个方向,位置始终都是相对于字符的开始,从左向右数的。

    问题所讲的是提取子字符串。我们要提取左边的固定位数的字符串,可以用Left完成。而右边剩余的字符串,我们可以用Right从右向左提取一定数量的字符串。所以问题使用Right就可以解决。

    但是我们并不会仅限于解决这个问题。出现这个提问,说明你对字符串的操作并不熟悉。所以我写了一系列所有常用的字符操作的示例代码,附带注释,让你可以迅速掌握字符操作的所有函数和代码用法。这样你以后就不会再有字符串处理上的问题了。请认真自己写下这些示例代码。如果你能够达到随意处理字符串,那就完全过关了。

    字符串处理到处都会用到,非常基础而有用,是每一个程序员必须掌握的基础。请认真来全面学习一遍。

    下面是CString字符串处理的各种用法:(其他的字符串处理类其实和这个差不多,可以触类旁通,只是函数名称不一致罢了)

CString rst;
CString str=_T("2017020025001");
//Format 字符串格式化,同printf用法
//GetLength 获取长度
int len = str.GetLength();
rst.Format(_T("字符串[%s]的长度:%d\n"),str,len);
MessageBox(rst);
//IsEmpty   判断是否为空字符串
bool is_empty = str.IsEmpty();
if (is_empty)MessageBox(_T("字符串为空"));
else MessageBox(_T("字符串不会空"));
//Empty  清空字符串
str.Empty();
MessageBox(str);//直接将这个字符串清空了。
//GetAt [] 取字符串的字符
if(_T(''2'')==str[0])
	MessageBox(_T("第一个字符为2"));
else
	MessageBox(_T("第一个字符不为2"));//因为字符被清空了。
str+=_T("2017020025001");//+ = +=字符串拼接赋值
if(_T(''2'')==str.GetAt(0))//GetAt和[]功能等价
	MessageBox(_T("第一个字符为2"));
else
	MessageBox(_T("第一个字符不为2"));
//SetAt  设置字符串的字符,第一个参数为位置,0开始。第二个位置为字符。用_T()括起来字符
str.SetAt(0,_T(''1''));//SetAt不能用[]替代
if(_T(''2'')==str.GetAt(0))
	MessageBox(_T("SetAt第一个字符为2"));
else
{
	MessageBox(_T("SetAt第一个字符不为2"));
	MessageBox(str);//第一个字符已经被SetAt更改为1了
}
str = _T("   2017 ");
//TrimLeft   去除左边的空格,直接修改到被操作的字符串
str.TrimLeft();
rst.Format(_T("截断左边空白字符后的字符串为:%s!,长度为:%d"),str,str.GetLength());
MessageBox(rst);
//TrimRight  去除右边的空格,直接修改到被操作的字符串
str.TrimRight();
rst.Format(_T("截断右边空白字符后的字符串为:%s!,长度为:%d"),str,str.GetLength());
MessageBox(rst);
str= _T(" 2017 ");
str.Trim();//去除左右两边的空格,直接修改到被操作的字符串
rst.Format(_T("截断左右两边空白字符后的字符串为:%s!,长度为:%d"),str,str.GetLength());
MessageBox(rst);
str=_T("http://www.cjjjs.com/index.html");
//Left 提取左边一段子字符串,从最左边开始数,只提取一段子字符串,不会对操作的字符串进行修改
rst = str.Left(7);//截取http://
MessageBox(rst);
//Right 提取右边一段子字符串,从结尾开始往开头数,只提取一段子字符串,不会对操作的字符串进行修改
rst = str.Right(11);//截取/index.html
MessageBox(rst);
//Mid 提取中间一段子字符串,在指定位置从左到右数,只提取一段子字符串,不会对操作的字符串进行修改
rst = str.Mid(11,5);//截取cjjjs
MessageBox(rst);
//Find 字符串查找,返回找到的字符或子字符串在这个字符串的多少个字符的位置,从0开始。找不到返回-1
int pos = str.Find(_T("cjjjs"),0);//第二个参数表示从哪里开始找,默认从0开始找。
rst.Format(_T("子字符串所在位置:%d"),pos);
MessageBox(rst);
//ReverseFind 字符串反向查找
pos = str.ReverseFind(_T(''h''));
rst.Format(_T("子字符串反向查找字符所在位置:%d"),pos);
MessageBox(rst);
//Replace 字符串替换,直接对原字符串进行修改
str.Replace(_T("com"),_T("cn"));
MessageBox(str);
     对于最开始部分的理解,是对字符串的理解必不可少的。后面是操作字符串需要的,两部分都需要仔细看哦。