曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5348|回复: 0
打印 上一主题 下一主题

[MFC] CString 类常用方法介绍

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2013-7-23 10:52:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
说明:下面的示例代码运行于 Win32 的控制台应用程序,在 Visual Studio 2010 里很容易通过向导建立这样一个可以使用 MFC 的控制台应用程序工程。

一. CString 类对象的初始化

1. 定义一个 CString 对象:
CString str;

2. 定义一个 CString 对象,并用一个字符串进行初始化:
CString str1(_T("hello"));
CString str2 = _T("world");

3. 使用数组来初始化 CString 对象:
[C++] 纯文本查看 复制代码
TCHAR szBuf[] = _T("hello world\n");
            CString str3(szBuf);
            CString str4 = szBuf;
            _tprintf(str3);
            _tprintf(str4);[/quote]

之所以数组可以通过 '=' 号直接赋值给一个对象是因为在 CString 中已经对 '=' 号进行了重载。

4. 使用指针来初始化 CString 对象:
[mw_shl_code=cpp,true]TCHAR *p = _T("hello world\n");
            CString str3(p);
            CString str4 = p;
            _tprintf(str3);
            _tprintf(str4);


5. 用一个 CString 对象去初始化另外一个 CString 对象:
[C++] 纯文本查看 复制代码
TCHAR *p = _T("hello world\n");
            CString str3(p);
            CString str4(str3);
            CString str5(str3);
            _tprintf(str4);
            _tprintf(str5);


二、操作字符串的常用方法

1. 使用 GetLength() 获得字符串的长度:
[C++] 纯文本查看 复制代码
CString str =  _T("hello world\n");
            int str_len = str.GetLength();
            printf("%d\n",str_len);

输出结果为 12 。注意,这里的 12 并不一定是 12 个字节,还可能是 24 个字节--因为采用了 UNICODE 的缘故。

2. 使用 IsEmpty() 方法判断是否为空,使用 Empty() 方法清空字符串:
[C++] 纯文本查看 复制代码
CString str =  _T("你好世界\n");

            BOOL isEmpty = str.IsEmpty();
            if (isEmpty)
                _tprintf(_T("对象为空\n"));
            else
                _tprintf(_T("对象非空\n"));

            str.Empty();
            isEmpty = str.IsEmpty();
            if (isEmpty)
                _tprintf(_T("对象为空\n"));
            else
                _tprintf(_T("对象非空\n"));


3. 使用 MakeUpper()MakeLower() 来转换大小写,使用 MakeReverse() 进行翻转:
[C++] 纯文本查看 复制代码
CString str =  _T("HELLO WORLD\n");

            str.MakeLower();
            _tprintf(str);

            str.MakeUpper();
            _tprintf(str);

            str.MakeReverse();
            _tprintf(str);

输出:
hello world
HELLO WORLD

DLROW OLLEH

4. 使用 +, += 符号对字符串进行连接
[C++] 纯文本查看 复制代码
CString str =  _T("ccc");

            str = _T("bbb") + str + _T("ddd");
            _tprintf(str);
            _tprintf(_T("\n"));

            str += _T("eee");
            _tprintf(str);
            _tprintf(_T("\n"));

            TCHAR szBuf[] = _T("fff");
            str += szBuf;
            _tprintf(str);
            _tprintf(_T("\n"));

输出:
bbbcccddd
bbbcccdddeee
bbbcccdddeeefff
这两个操作符都是重载操作符。

5. 字符串比较操作符:==, !=, (<, >, <=, >= 这几个不常用), Compare 是区分大小写的比较,CompareNoCase 是不区分大小写的比较:
[C++] 纯文本查看 复制代码
CString str1(_T("hello"));
            CString str2 (_T("HeLLo"));

            if (str1 == str2)
                _tprintf(_T("两个字符串相等\n"));
             else
                 _tprintf(_T("两个字符串不相等\n"));

            if (!str1.CompareNoCase(str2))
                _tprintf(_T("两个字符串相等\n"));
            else
                 _tprintf(_T("两个字符串不相等\n"));

输出:
两个字符串不相等
两个字符串相等
像 Compare 和 CompareNoCase 的比较结果,如果字符串相等,那返回值为 0 。

6. 使用 Find, ReverseFind, FindOneOf 对字符串进行查找。

6.1. Find 从指定位置开始查找指定的字符或字符串,并返回其位置,找不到则返回 -1 。
[C++] 纯文本查看 复制代码
CString str(_T("abcdefghijk"));

            int pos = str.Find(_T("def"), 0);
            printf ("%d\n", pos);

输出结果为 3(第 1 个字符位置为 0) 。

6.2. ReverseFind 是从字符串的末尾开始查找指定的字符(不是字符创),并返回其位置,找不到则返回 -1 。
[C++] 纯文本查看 复制代码
CString str(_T("abcdefghijk"));

            int pos = str.ReverseFind('i');
            printf ("%d\n", pos);

输出结果为 8 。

6.3. FindOneOf 查找参数中给定字符串中的 任意字符,返回第一次出现的位置,找不到则返回 -1 。
[C++] 纯文本查看 复制代码
CString str(_T("abcdefghijk"));

            int pos = str.FindOneOf(_T("fgh"));
            printf ("%d\n", pos);

输出为 5, 字符串 "fgh" 中的字符 'f' 可以从 "abcdefghijk" 中找到。如果将 "fgh" 改为 "Zgh",那么返回结果为 6,此时找的是 g 这个字符的位置。


7. 使用 Replace 替换字符或字符串,并返回替换的个数,无匹配则返回 0.
[C++] 纯文本查看 复制代码
CString str(_T("abcdefghijk"));

            int num = str.Replace('d','D');
            _tprintf(str);
            printf ("------%d\n", num);

            num = str.Replace(_T("def"), _T("DEF"));
            _tprintf(str);
            printf ("------%d\n", num);

输出:
abcDefghijk------1
abcDefghijk------0

8. 使用 Remove 删除 CString 对象中指定的字符,并返回删除字符的个数:
[C++] 纯文本查看 复制代码
CString str(_T("abcDDefgDDxyz"));

            int num = str.Remove('D');
            _tprintf(str);
            printf ("------%d\n", num);

输出:
abcefgxyz------4

9. 使用 Delete 删除 CString 对象中指定位置的字符,并返回处理后的字符串长度:
[C++] 纯文本查看 复制代码
CString str(_T("abcdefghijk"));

            int num = str.Delete(3,3);
            _tprintf(str);
            printf ("------%d\n", num);

输出:
abcghijk------8
Delete 函数有两个参数,第 1 个参数是一个索引,表示从哪个位置起开始删除,第 2 个参数表示要删除索引后面的连续几个字符。如果省略了第 2 个参数,那么默认只索引位置的那个字符。

10. 使用 Left, Mid, Right 分别从 CString 对象的左,中,右进行字符串的提取操作:
[C++] 纯文本查看 复制代码
CString str(_T("abcdefghijk"));

            CString str2 = str.Left(4);
            _tprintf(str2);
            printf("\n");

            str2 = str.Right(3);
            _tprintf(str2);
            printf("\n");

            str2 = str.Mid(3);
            _tprintf(str2);
            printf("\n");

            str2 = str.Mid(3, 4);
            _tprintf(str2);
            printf("\n");

输出:
abcd
ijk
defghijk
defg

11. 使用 GetAt 从 CString 对象中获取单个 TCHAR 类型字符,使用 SetAt 修改 CString 对象中的单个字符:
[C++] 纯文本查看 复制代码
CString str(_T("abcdefghijk"));

            TCHAR ch = str.GetAt(5);

            _tprintf(_T("%c\n"), ch);

            str.SetAt(4, 'E');
            _tprintf(str);
            printf("\n");
                
            _tprintf(_T("%c\n"), str[2]);

输出:
f
abcdEfghijk
c
在 SETAt 中,第 1 个参数指名了要修改字符的位置,第 2 个参数表示要替换的字符。另外,也可以使用 [ ] 操作符来获取 CString 对象中单个操作符,如 str[2] ,但这是只读的,不能修改。


12. 使用 Format 把其它类型向 CString 类型转换。
在这些转换中,可以对 int, long 等数值类型的转换,也可以对 TCHAR, TCHAR * 等类型的转换:
[C++] 纯文本查看 复制代码
int num = 10;
            CString str;
            str.Format(_T("%d"), num);
            _tprintf(str);

输出为 10 。注意,不能直接用整数型来初始化,如 CString str(num); 。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-29 09:13 , Processed in 0.080962 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表